上课
class A(object):
z = 0
def Func1(self):
return self.z
def Func2(self):
return A.z
两种方法(Func1
和Func2
)都给出相同的结果,并且仅包含在此人工示例中,以说明如何解决z
的两种可能方法。
Func*
的结果只有在实例使用z
之类的内容self.z = None
时才会有所不同。
使用z
或Func1
的语法访问类变量Func2
的正确python方法是什么?
答案 0 :(得分:3)
我想说获取变量的正确方法就是:
a_instance.z #instance variable 'z'
A.z #class variable 'z'
此处无需Func1
和Func2
。
作为旁注,如果您必须撰写Func2
,那么classmethod
似乎是合适的:
@classmethod
def Func2(cls):
return cls.z
最后请注意,您在方法(self.z
与A.z
与cls.z
与classmethod
)中使用的版本实际上取决于您希望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__
属性。