自从我开始使用Python以来,我一直不清楚:为什么我会使用这个__init__
版本:
class FooInst:
def __init__(self, x=None):
self.x = x
在这个使用类变量的版本中:
class FooCls:
x = None
第二个例子显然导致更少的代码似乎更容易阅读给我。此外,日常使用几乎没有差别:
inst = FooInst()
cls = FooCls()
print(inst.x, cls.x) # None, None
inst.x = 1
cls.x = 1
print(inst.x, cls.x) # 1, 1
所以基本上我都是默认值None
,并且在两种情况下获取值(obj.x
)之间没有区别。我也可以将两个变量都设置为一个值,并且它将起作用(因为cls.x = 1
通过创建实例变量来替换“类变量的值”。
我知道__init__
用于创建实例变量而class Foo: x = None
用于创建类变量,但为什么?我发现创建类变量的方法也适用于实例变量,而且代码更清晰!
编辑:如果变量需要一些自定义行为,我会使用__init__
,如下所示:
class Foo:
def __init__(self, x=0):
try:
self.x = int(x)
except ValueError as e:
log_error(e)
raise e
EDIT2:这个问题更多的是关于不可变的默认值,为什么要在__init__
(如果它们应该?)而不是在类的命名空间中完成它们,所以它不是与标记的问题重复。
EDIT3:此外,我更想问是否有任何理由不使用类变量而不是实例变量;答案如“类变量在所有实例之间共享,实例变量不是”不回答我的问题,因为(如下面的代码示例所示)类变量也可以正常工作。