【问题标题】:How should I refer to class variables in Python?我应该如何在 Python 中引用类变量?
【发布时间】:2016-11-04 12:10:56
【问题描述】:

在 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

【问题讨论】:

    标签: python class variables


    【解决方案1】:

    如果你只有一个类并且你只读取变量,你不会看到很多差异。

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

    另外,如果你想设置值,self.whatever = 将设置一个实例变量,Foo.whatever = 将设置类变量,这也会影响任何其他实例。

    【讨论】:

      【解决方案2】:

      在您的示例中使用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 的种类。

      【讨论】:

        猜你喜欢
        • 2014-03-20
        • 1970-01-01
        • 2018-03-16
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2016-06-21
        相关资源
        最近更新 更多