在__init__中定义实例变量vs类的命名空间?

时间:2015-06-24 09:48:01

标签: python instance-variables class-variables

自从我开始使用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:此外,我更想问是否有任何理由不使用类变量而不是实例变量;答案如“类变量在所有实例之间共享,实例变量不是”不回答我的问题,因为(如下面的代码示例所示)类变量也可以正常工作。

0 个答案:

没有答案