![](/img/trans.png)
[英]Python class: How to check whether an attribute is defined inside __init__ or outside __init__
[英]How to change a class attribute inside __init__?
class Ant:
count = 0
def __init__(self):
if count == 0:
self.real = True
else:
self.real = False
count += 1
基本上我想要实现的是我只想让这个类的第一个实例将“real”属性设置为True
,将后续属性设置为False
。 我现在知道这会给我带来unboundlocal错误的count
。 我该如何工作?
将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
首选使用self.__class__.variable
- 除非您希望所有子类共享同一个变量。
在这样的代码中:
class Ant:
count = 0
“count”值存储在类' __dict__
属性中。 如果您执行以下操作:
class Ant:
count = 0
def __init__(self):
print(self.count)
Python的数据模型中定义的attrobute访问机制将看到实例“self”中没有count
实例,并从其类中检索值。 因此,如果您正在从类变量中读取值,则可以将其用作普通实例。
但是,如果您的代码如下:
def __init__(self):
self.count += 1
在完全不同的事情中会发生什么:Python从上面的类中读取属性,向其中添加1,并将新结果存储在实例中。
因此,无论何时您想要访问类值,您都可以对类名进行硬编码 - (因为在运行方法代码时,类已经创建并且“已知”):
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
的值,并在第一次运行此代码时在子类上创建一个新值)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.