我应该如何在Python中引用类变量?

时间:2016-07-02 03:45:49

标签: python class variables

在Python中,我可以从类中引用具有ClassName.class_varself.class_var的类级变量。现在,只要我不通过创建一个同名的实例变量来覆盖对象中的类级别变量名称(我发现它会很傻),它们总是会引用相同的东西。

我的问题是,这是一种更好的做法?或者更常见?

我用任何一种方式看到编码书籍和源代码本身。在某些情况下,我看到他们使用BOTH方法来引用同一个类中的变量,我认为它实际上是不一致的。

这里我举一个例子:

class Foo(object) :
    class_var = ['same','for','all']
    def __init__(self, instance_var) :
        self.instance_var = instance_var
    def print_words(self) :
        # here I could use self.class_var
        for w in Foo.class_var :
            print w

2 个答案:

答案 0 :(得分:6)

如果你只有一个班级并且你只阅读变量,你就不会发现很多不同。

如果考虑覆盖class_var的子类的可能性,那么self.class_var将首先查看当前类,而Foo.class_var将继续具体地指向该特定值。最佳实践取决于您的意图,但由于使用使其成为可选语言的类意味着至少对多态性感兴趣,self可能更普遍有用。

此外,如果要设置值,self.whatever =将设置一个实例变量,Foo.whatever =将设置类变量,这样可以影响任何其他实例。

答案 1 :(得分:0)

您的示例中使用Foo.class_var的问题在于继承。你可以在这里看到它,从你的Foo()类开始:

class Bar(Foo):
    class_var = ['other','one','here']

In [2]: a = Foo(['one'])

In [3]: b = Bar(['one'])

In [4]: a.class_var
Out[4]: ['same', 'for', 'all']

In [5]: b.class_var
Out[5]: ['other', 'one', 'here']

In [6]: b.print_words()
same
for
all

这可能是你想要的行为,但我认为这种情况并不常见。你通常会遇到self种。