class Ant:
count = 0
def __init__(self):
if count == 0:
self.real = True
else:
self.real = False
count += 1
所以基本上我想要实现的是我只希望这个类的第一个实例拥有" real"属性为True
,后续属性为False
。我现在知道这会给我count
的无限制本地错误。我如何使这项工作?
答案 0 :(得分:6)
将count
更改为Ant.count
由于count
是一个类成员(在所有Ant类实例之间共享)并且不属于特定实例,因此您应该将它与类名的前缀一起使用。
class Ant:
count = 0
def __init__(self):
if Ant.count == 0:
self.real = True
else:
self.real = False
Ant.count += 1
答案 1 :(得分:1)
首选使用self.__class__.variable
- 除非您希望所有子类共享相同的变量。
在这样的代码中:
class Ant:
count = 0
"计数"价值存储在班级' __dict__
属性。
如果您执行以下操作:
class Ant:
count = 0
def __init__(self):
print(self.count)
Python数据模型中定义的attrobute访问机制将看到实例中没有count
的实例" self",并从其类中检索值。因此,如果您从类变量中读取值,则可以使用它,就像普通实例一样。
但是,如果您的代码如下:
def __init__(self):
self.count += 1
在不同的事情中会发生什么:Python 如上所述从类中读取属性,向其中添加1,并将新结果存储在实例中。
因此,每当您想要访问类值时,您都可以对类名进行硬编码 - (因为在运行方法代码时,类已经创建并且已经是#34;已知"):
class Ant:
count = 0
def __init__(self):
Ant.count += 1
或者,更好的是,使用实例的__class__
属性 - 这样您将始终获得正确子类的变量值
class Ant:
count = 0
def __init__(self):
self.__class__.count += 1
class FireAnt(Ant):
count = 0
(请注意,与上面的第二个示例一样,如果子类不包含自己的count
变量,则会读取超类“count
”中的值,并创建一个新值在第一次运行此代码时在子类上)