Python 3 - 直接操作类的属性是否覆盖其对象的相同属性,使属性纯静态?



在学习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.membersm2.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"段落解释你认为合乎逻辑的。

最新更新