如果我上课
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
然后在控制台中说
x=MyClass()
x.counter = 1
vars(x) # returns {'counter': 1}
x.__dict__ # returns {'counter': 1}
为什么它不知道x的i属性?我确信这是因为我对我在Python中如何定义类的各种属性的误解。
Python 2/3在这方面有什么区别吗?致电dir(x)
会给我所有我期望的东西。
我怀疑其他初学者已经问过这个问题,但在这个阶段我不知道在问题标题中寻找正确的事情。网站建议的所有内容都不正确。
答案 0 :(得分:5)
i
被定义为类的属性,而不是实例。您会发现只有MyClass.i
的{{1}}个版本在MyClass
的所有实例之间共享:
In [133]: x = MyClass()
In [134]: y = MyClass()
In [135]: x.i, y.i, MyClass.i
Out[135]: (12345, 12345, 12345)
In [136]: MyClass.i = 54321
In [137]: x.i, y.i, MyClass.i
Out[137]: (54321, 54321, 54321)
您还会发现i
很好地坐在MyClass.__dict__
内:
In [138]: vars(MyClass)
Out[138]:
mappingproxy({'__dict__': <attribute '__dict__' of 'MyClass' objects>,
'__doc__': 'A simple example class',
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
'f': <function __main__.MyClass.f>,
'i': 54321}) # <------
请注意,类属性的另一个有趣特性是它们不与实例属性冲突:
In [148]: class MyClass:
...: i = 12345
...: def __init__(self):
...: self.i = 54321
...:
In [149]: x = MyClass()
In [150]: MyClass.i, x.i
Out[150]: (12345, 54321)