访问python类变量的正确方法是什么?

时间:2012-11-19 13:48:21

标签: python class-variables

上课

class A(object):
    z = 0

    def Func1(self):
        return self.z

    def Func2(self):
        return A.z

两种方法(Func1Func2)都给出相同的结果,并且仅包含在此人工示例中,以说明如何解决z的两种可能方法。

Func*的结果只有在实例使用z之类的内容self.z = None时才会有所不同。

使用zFunc1的语法访问类变量Func2的正确python方法是什么?

3 个答案:

答案 0 :(得分:3)

我想说获取变量的正确方法就是:

a_instance.z  #instance variable 'z'
A.z           #class variable 'z'

此处无需Func1Func2


作为旁注,如果您必须撰写Func2,那么classmethod似乎是合适的:

@classmethod
def Func2(cls):
    return cls.z

最后请注意,您在方法(self.zA.zcls.zclassmethod)中使用的版本实际上取决于您希望API的使用方式表现。您是否希望用户能够通过设置实例属性A.z来隐藏z?如果是,请使用self.z。如果您不想要阴影,可以使用A.z。该方法是否需要self?如果没有,那么它可能是一种类方法等。

答案 1 :(得分:1)

我通常会使用self.z,因为如果有z的不同值的子类,它会选择“正确的”。不这样做的唯一原因是如果你知道你总是想要A版本。

通过自我或通过classmethod访问(参见mgilson的答案)也有助于创建mixin类。

答案 2 :(得分:0)

如果你不关心价值破坏和类似的事情,你可以使用self.z。否则,A.z无疑将评估为类变量。但要注意,如果子类B重新定义z Func2会发生什么:

class B(A):
    z = 7

b = B()
b.Func2()  # Returns 0, not 7

毕竟,这是合乎逻辑的。因此,如果您想以某种方式以某种方式访问​​类变量 polymorphic ,则可以执行以下操作之一:

self.__class__.z
type(self).z

According to the documentation,第二种形式不适用于旧式类,因此第一种形式通常在Python 2.x版本中更具可比性。但是,第二种形式对于新式类是最安全的,因此对于Python 3.x,因为类可能会重新定义__class__属性。