Python类。 key作为self.key存在,但不存在于self .__ dict__中

时间:2014-08-11 16:48:35

标签: python arrays class oop

我的课程包含三个大的词组,一个出现在self.__dict__,另外两个出现在。{/ p>

示例:

class MyClass:
  big_matrix = {}
  side_array = {}
  map_of_data = {}
  def __init__( self ):
      # etc...

虽然我试图将self.__dict__转储到终端,但我只成功查看了big_matrix并找到了其他字符。

__init__中没有一个数组声明,后来在其他函数中声明了它。

请帮帮我?

2 个答案:

答案 0 :(得分:6)

您应该在__init__中初始化变量并将它们分配给对象self,以使它们属于实例名称空间(在调用__dict__时显示的名称空间对象

否则它们不是对象实例命名空间的一部分,而是 class 命名空间的一部分。

您可能在实例命名空间中看到big_matrix,因为您正在类中的其他位置创建self.big_matrix


实例名称空间

中的变量
class MyClass:
    def __init__( self ):
        self.big_matrix = {}
        self.side_array = {}
        self.map_of_data = {}

变量属于实例名称空间:

>>> print MyClass().__dict__ 
{'big_matrix': {}, 'side_array': {}, 'map_of_data': {}}

该类在其命名空间中没有任何变量

>>> print MyClass.__dict__
{}

类命名空间中的变量

class MyClass:
    big_matrix = {}
    side_array = {}
    map_of_data = {}

实例的名称空间中没有变量

>>> print MyClass().__dict__ 
{}

所有变量都属于 class 命名空间(以及该类使用的其他变量):

>>> print MyClass.__dict__
{'big_matrix': {}, 'side_array': {}, '__module__': '__main__', 'map_of_data': {}, '__doc__': None}

答案 1 :(得分:2)

最好用示例显示class attributesinstance attributes之间的差异:

In [25]: class MyClass:
   ....:       cls_dict = {} # class attribute
   ....:       def __init__( self ):
   ....:               pass
   ....:           

In [26]: 

In [26]: m = MyClass() # first instance

In [27]: m.cls_dict["foo"] = "bar" # first instance adds to dict

In [28]: m1 = MyClass() # second instance 

In [29]: m1.cls_dict["bar"] = "foo" # second instance adds to dict

In [30]: MyClass.cls_dict
Out[30]: {'bar': 'foo', 'foo': 'bar'} # both entries in the dict

In [31]: m.cls_dict  # can be accessed through the class or an instance
Out[31]: {'bar': 'foo', 'foo': 'bar'}
In [32]: m1.cls_dict
Out[32]: {'bar': 'foo', 'foo': 'bar'}

实例属性:

In [33]: class MyClass:
   ....:    def __init__( self ):
   ....:       self.ins_dict = {}
   ....:         

In [34]: m = MyClass()

In [35]: m.ins_dict["foo"] = "bar" 

In [36]: m1 = MyClass()

In [37]: m1.ins_dict["bar"] = "foo"

In [38]: m.ins_dict   # each instance has its own `ins_dict`
Out[38]: {'foo': 'bar'}

In [39]: m1.ins_dict
Out[39]: {'bar': 'foo'}

class attributesinstances之间共享,instance attributes分别为每个实例创建。

每次更改class attribute cls_dict时,两个实例都会更改。