我的课程包含三个大的词组,一个出现在self.__dict__
,另外两个出现在。{/ p>
示例:
class MyClass:
big_matrix = {}
side_array = {}
map_of_data = {}
def __init__( self ):
# etc...
虽然我试图将self.__dict__
转储到终端,但我只成功查看了big_matrix
并找到了其他字符。
__init__
中没有一个数组声明,后来在其他函数中声明了它。
请帮帮我?
答案 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 attributes
和instance 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 attributes
在instances
之间共享,instance attributes
分别为每个实例创建。
每次更改class attribute
cls_dict
时,两个实例都会更改。