【问题标题】:List of Classes in List of Classes access [Python] [duplicate]类访问列表中的类列表 [Python] [重复]
【发布时间】:2021-04-16 02:50:51
【问题描述】:

我尝试将一个类列表附加到另一个类列表中,如下面的代码。

class Power:                                                                                                                
  def __init__(power, name='VDD', value='1.8'):                                                                             
  | power.name    = name                                                                                                    
  | power.value   = value                                                                                                   
                                                                                                                            
class Condition:                                                                                                            
  def __init__(condition, name='TYP', power=[]):                                       
  | condition.name    = name                                                                                                                                                                                             
  | condition.power   = power                                                                                                                                                                                                                                                                                                       
  def addpower(condition, power, value):                                                                                    
  | condition.power.append( Power( name=power, value=value ) )                                                              
                                                                                                                            
class WorkingCell:                                                                                                          
  def __init__(cell, name='name', cond=[]):                                                                                                            
  | cell.name       = name                                                                                                                                                                                                
  | cell.cond       = cond                                                                                                  
  def setpower(cell, cond, power, value):                 
  | for x in cell.cond:                                   
  | ¦ if( x.name == cond ):                                
  | ¦ ┆ x.addpower( power=power, value=value )          
  | ¦ ┆ break

我在单元格中添加了两个条件,如下所示。

cell.cond.append( Condition( name='FAST' ) )
cell.cond.append( Condition( name='SLOW' ) )

之后,我根据条件名称将两个 Power 类的元素附加到单独的条件中。

cell.setpower( cond='FAST', power='VDD', value='0.9' )
cell.setpower( cond='FAST', power='VCCQ', value='1.9' )
cell.setpower( cond='SLOW', power='VDD', value='0.65' )
cell.setpower( cond='SLOW', power='VCCQ', value='1.65' )

因此,它也被附​​加到两个条件中(我自己格式化了打印输出的结果以便于调试)。

{name : 'cell_1', 
 cond : {name : 'FAST', power : {name : 'VDD', value : '0,9'
                                 name : 'VCCQ', value : '1.9'
                                 name : 'VDD', value : '0.65'
                                 name : 'VCCQ', value : '1.65'}
         name : 'SLOW', power : {name : 'VDD', value : '0,9'
                                 name : 'VCCQ', value : '1.9'
                                 name : 'VDD', value : '0.65'
                                 name : 'VCCQ', value : '1.65'}
        }
}

然后,我通过所有 Power 对象存储的地址检查了它。令人惊讶的是,两个单独条件的所有幂都存储在同一个地址中。


{name : 'cell_1', 
 cond : {name : 'FAST', power : {<__main__.Power object at 0x2b0d6d906c88>
                                 <__main__.Power object at 0x2b0d6d906d68>
                                 <__main__.Power object at 0x2b0d6d906da0>
                                 <__main__.Power object at 0x2b0d6d906e10>}
         name : 'SLOW', power : {<__main__.Power object at 0x2b0d6d906c88>
                                 <__main__.Power object at 0x2b0d6d906d68>
                                 <__main__.Power object at 0x2b0d6d906da0>
                                 <__main__.Power object at 0x2b0d6d906e10>}
        }
}                            

我想知道为什么我已经根据自己的名称访问了各个条件,但它仍然将 Power 对象附加到两个条件中。

编辑: 作为 Aagam Sheth,我错过了解释我的预期输出。因此,下面的描述是一个。

{name : 'cell_1', 
 cond : {name : 'FAST', power : {name : 'VDD', value : '0,9'
                                 name : 'VCCQ', value : '1.9'}
         name : 'SLOW', power : {name : 'VDD', value : '0.65'
                                 name : 'VCCQ', value : '1.65'}
        }
}

【问题讨论】:

  • 你能提供预期的输出吗?以及您是如何获得打印结果的。
  • 亲爱的@AagamSheth,我添加了我的预期输出作为您的要求。但是,正如我上面提到的,我对输出进行了格式化以更清楚地解释它。我自己的代码有更多的数据要显示,并且描述所有内容更复杂,而不是专注于我上面编辑的代码以更清楚地显示问题。然而,我使用attrs=vars(cell)attrs=vars(cell.cond) 来转换所有项目。然后,我使用print( ', '.join("%s: %s" % item for item in attrs.items())) 将它们打印出来。
  • @ĐứcMinhPhạm 我在下面编辑了我的答案。它用 attrs=var(cell.cond) 解决了你的问题。问题在于您提供了可变默认参数列表的 init 方法。请按照我的回答中所述进行更改

标签: python list class


【解决方案1】:

这是预期的输出。

Name: cell_1, 
    Condition: {
        Name: FAST, Power: {
             Name: VDD, Value: 0.9
             Name: VCCQ, Value: 1.9
        Name: SLOW, Power: {
             Name: VDD, Value: 0.65
             Name: VCCQ, Value: 1.65
  
// Memory reference of power objects are also different
Name: cell_1, 
    Condition: {
        Name: FAST, Power: {
         [<__main__.Power object at 0x000001F46DBFE880>, 
          <__main__.Power object at 0x000001F47E10EF40>],
        Name: SLOW, Power: {
         [<__main__.Power object at 0x000001F47E2C6F40>, \
          <__main__.Power object at 0x000001F47E2C6400>],

我想这就是你想要的。

一些微不足道的变化:

  1. self 的所有方法的第一个参数,因为它是约定和电源,条件,单元格令人困惑。
  2. 为了简单起见,我使用了 dunder 方法 __str__ 进行打印,因为我不知道您是如何获得该输出的。
  3. 我更改了方法名称以更好地适应 pep8。

重大变化:

  1. 默认参数设置为__init__ 方法中的列表。将其更改为 None 并在之后处理 None 输入以初始化列表。

以上输出的来源。

class Power:
    def __init__(self, name='VDD', value='1.8'):
        self.name = name
        self.value = value

    def __str__(self):
        print('\t\t\t', f'Name: {self.name}, Value: {self.value}')
        return ''


class Condition:
    def __init__(self, name='TYP', power=None): # handled the mutable default argument
        if power is None: # handled the mutable default argument
            power = []
        self.name = name
        self.power = power

    def add_power(self, power, value):
        self.power.append(Power(name=power, value=value))

    def __str__(self):
        print(f'Name: {self.name}, Power: {{')
        print('\t\t', f'{[str(pow) for pow in self.power]},')
        return ''


class WorkingCell:
    def __init__(self, name='name', cond=None): # handled the mutable default argument
        if cond is None:  # handled the mutable default argument
            cond = []
        self.name = name
        self.cond = cond

    def set_power(self, cond, power, value):
        for x in self.cond:
            if x.name == cond:
                x.add_power(power=power, value=value)
                break

    def __str__(self):
        print(f'Name: {self.name}, \n Condition: {{')
        print('\t', f'{[str(condi) for condi in self.cond]}')
        return ''


if __name__ == '__main__':
    cell = WorkingCell(name='cell_1')  #  initialized the cell
    cell.cond.append(Condition(name='FAST'))
    cell.cond.append(Condition(name='SLOW'))
    cell.set_power(cond='FAST', power='VDD', value='0.9')
    cell.set_power(cond='FAST', power='VCCQ', value='1.9')
    cell.set_power(cond='SLOW', power='VDD', value='0.65')
    cell.set_power(cond='SLOW', power='VCCQ', value='1.65')

    attrs = vars(cell)
    print(', '.join("%s: %s" % item for item in attrs.items()))
    attrs = vars([condi for condi in cell.cond][0])
    print(', '.join("%s: %s" % item for item in attrs.items()))
    attrs = vars([condi for condi in cell.cond][0])
    print(', '.join("%s: %s" % item for item in attrs.items()))

**供参考:**

  1. Default Parameter Values in Python
  2. “Least Astonishment” and the Mutable Default Argument

【讨论】:

  • 亲爱的@AagamSheth,非常感谢您快速而清晰的回答!正如我所看到的,问题来自一个空列表,而您使用的是可变默认参数而不是一个。
  • 我的荣幸。 ?
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-07-21
  • 2015-03-16
相关资源
最近更新 更多