我正在看堆栈溢出问题计算一个类的实例? https://stackoverflow.com/questions/8628123/counting-instances-of-a-class,我不确定为什么该解决方案有效,而使用简单加法的解决方案却无效。我想这更多的是如何存储和访问类变量与实例变量的问题。
这是我认为应该有效的代码,但会产生4
对于每一个id
:
class foo():
num = 3 # trying 3 instead of 0 or 1 to make sure the add is working
def __init__(self):
self.num += 1
self.id = self.num
f = foo()
g = foo()
print f.id # 4
print g.id # 4
The self.num +=1
语句在某种程度上起作用(正在发生添加,但没有发生赋值)。
幕后发生的事情导致这项任务在这里失败,而itertools.count
分配在其他问题的解决方案中成功吗?
整数不实现__iadd__
(就地添加,对于+=
),因为它们是不可变的。口译员回到标准分配并__add__
相反,所以这一行:
self.num += 1
becomes:
self.num = self.num + 1
在右侧你会得到foo.num
(i.e. 3
) via self.num
,正如你所料,但有趣的是分配给实例属性num
shadows类属性。所以该行实际上相当于:
self.num = foo.num + 1 # instance attribute equals class attribute plus one
All 实例以结束self.num == 4
和class遗迹foo.num == 3
。相反,我怀疑你想要的是:
foo.num += 1 # explicitly update the class attribute
或者,您可以将其实现为@classmethod
,更明确地处理该类:
class Foo(): # note naming convention
num = 3
def __init__(self):
self.increment()
self.id = self.num # now you're still accessing the class attribute
@classmethod
def increment(cls):
cls.num += 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)