0

上课

class A(object):
    z = 0

    def Func1(self):
        return self.z

    def Func2(self):
        return A.z

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

的结果Func*只有在实例会z使用类似self.z = None.

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

4

3 回答 3

3

我想说访问变量的正确方法很简单:

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

不需要Func1Func2这里。


作为旁注,如果您必须Func2,似乎 aclassmethod可能是合适的:

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

最后一点,您在方法中使用哪个版本(self.zvs. A.zvs. cls.zwith classmethod)实际上取决于您希望 API 的行为方式。您是否希望用户能够A.z通过设置实例属性来进行遮蔽z?如果是这样,那么使用self.z. 如果你不想要那种阴影,你可以使用A.z. 方法需要self吗?如果不是,那么它可能是一个类方法等。

于 2012-11-19T13:50:04.420 回答
1

我通常会使用self.z,因为如果存在具有不同值的子类,z它将选择“正确”的子类。不这样做的唯一原因是,如果您知道A尽管有该版本,您将始终想要该版本。

通过 self 或通过 classmethod 访问(请参阅 mgilson 的答案)也有助于创建 mixin 类。

于 2012-11-19T13:52:07.053 回答
0

如果您不关心价值破坏之类的事情,那么您可以使用self.z. 否则,A.z无疑会评估到类变量。B但是,请注意如果子类重新定义z 重新定义会发生什么Func2

class B(A):
    z = 7

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

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

self.__class__.z
type(self).z

根据文档,第二种形式不适用于旧式类,因此第一种形式通常在 Python 2.x 版本中更兼容。然而,对于新式类,第二种形式是最安全的,因此,对于 Python 3.x,类可能会重新定义__class__属性。

于 2013-02-04T00:17:55.533 回答