Python Class member variables initilialization?
遇到一个Python类,我发现很难理解它是如何工作的以及为什么工作的。类的一个简化示例是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Test:
def __init__(self):
self.var = 1
otherVar = 2
def myPrinter(self):
print self.__dict__ # Prints {'var': 1}
print self.var
print self.otherVar # Doubt !!
print self.__dict__ # Prints {'var': 1}
ob = Test()
ob.myPrinter() |
我怀疑self.otherVar调用没有抛出错误,而self.__dict__没有显示对otherVar的引用。
- 我觉得这很正常。只需打印NULL或类似策略。如果分配给它,那么它将在__dict__输出中。
- 谢谢@adam,这样可以消除我的疑虑。但我不明白的是,为什么变量otherVar不在myPrinter()的范围内,也就是说,为什么我不能在myPrinter()内做print otherVar
- 因为它是类本身的一部分,必须通过self.otherVar引用,类似于如何在彼此内部调用方法。
- 是的,有道理。那么,我们通常什么时候使用类变量呢?我知道它是跨类实例共享的,所以这是它的主要目的吗?
这是因为otherVar是class的属性,而在__init__中设置的var是实例的属性。
otherVar对实例可见,因为python首先尝试获取实例属性值,如果实例没有该属性值,那么它会检查其类属性。如果您用不同的值在两个函数中定义一个var,那么起初事情可能会变得混乱。
好吧,你知道吗,比较一下,类就像一个蓝图,实例是按照它构建的,对吗?因此,var是在创建实例时添加的一个额外项。
如果你想看otherVar,就去看Test.__dict__。它不会向您显示var,而是显示所有类属性。玩一点,随着时间的推移,你会习惯的。类属性可能很复杂,但非常有用。
otherVar是一个类成员,而不是实例成员,所以在__dict__中没有显示。
出现在self.__class__.__dict__中。(这种方法在Python2.x中不起作用)
顺便说一下,otherVar成员值在所有实例中共享,也可以从type对象:Test.otherVar访问。
示例:https://trinket.io/python3/d245351e58
如需更深入的解释,请查看此处