在学习Python中类是如何工作的时候,我遇到了一个类定义的例子,在我看来它的行为有点奇怪。
示例的目的是演示如何在Python中实现静态变量的行为。示例如下:
class MemberCounter:
members = 0
def init(self):
MemberCounter.members += 1
m1 = MemberCounter()
m1.init()
m2 = MemberCounter()
m2.init()
在设置类并创建对象之后,我打印了'members'属性的值。结果如下:
MemberCounter。member = 2
m1。member = 2
平方米。member = 2
那就是我感到困惑的时候。当我在等待'MemberCounter。成员= 2'其他两个结果对我来说没有意义-为什么'm1'和'm2'对象的'成员'值等于2?我认为这两个值都应该是0 -如果唯一被改变的属性是附加到MemberCounter类的"成员"属性,为什么它会导致每个类对象的自己唯一的"成员"值发生任何变化。看起来,'members'属性的地址就像'MemberCounter '。在每个对象的init()函数中的members += 1',完全覆盖m1.members和m2.members引用并将它们的指针重定向到值,使得三个指针都指向同一个值
= =比;m1。成员= m2。members = MemberCounter.members.
此外,我尝试以相反的方式定义类(增加self.members)。代替MemberCounter.members):class MemberCounter:
members = 0
def init(self):
self.members += 1
m1 = MemberCounter()
m1.init()
m2 = MemberCounter()
m2.init()
这个定义产生了合乎逻辑的结果(这让我对上面提到的奇怪行为更加好奇):
MemberCounter。member = 0
m1。member = 1
平方米。member = 1
简而言之,我很好奇为什么第一个类定义的行为方式如此奇怪?为什么只有'MemberCounter.members += 1' statement completed deleted 'm1.members' and 'm2.members的唯一值,并使其等于MemberCounter.members价值。我希望我能清楚地提出我的问题,我将非常高兴了解这种奇怪的行为:)
您可以读取使用instance.attribute
表示法的静态属性,以替代更自然的class.attribute
表示法,这是Python的预期功能。
来自文档:
Python同时支持静态数据和静态方法(c++或Java意义上的)。
对于静态数据,只需定义一个类属性。分配一个新的属性的值,则必须显式地使用类名任务:
对于任何class C: count = 0 # number of times C.__init__ called def __init__(self): C.count = C.count + 1 def getcount(self): return C.count # or return self.count
c
,
c.count
也指C.count
,使得isinstance(c, C)
保持,除非被c
本身或其他对象覆盖从c.__class__
返回到C
的基类搜索路径。注意:在
C
的方法中,像self.count = 42
这样的赋值在self
自己的字典中创建一个名为"count"的新的不相关实例。类-静态数据名的重新绑定必须始终指定类无论是否在方法内部:
C.count = 314
第一个代码块下面的段落解释了你的疑问。"Caution"段落解释你认为合乎逻辑的。