子类安全的类变量
我可以这样做:
class T(object):
i = 5
# then use the value somewhere in a function
def p(self):
print id(i), T.i
.. 但是,如果我碰巧创建了一个 T
的子类 ..
class N(T):
pass
.. 那么 N.i
实际上会变成 T.i
。我找到了一种处理这个问题的方法:
class T(object):
i = 5
def p(self):
print self.__class__.i
.. 这样做是否正确,能否确保有效?或者在某些情况下(我不知道的)会产生意想不到的行为吗?
2 个回答
1
呃...你知道吗?其实你可以通过实例来访问类的属性。
class T(object):
i = 5
def p(self):
print(id(self.i), self.i)
除了类的方法,我刚想到一个有趣的点子。为什么不使用一个属性来访问底层的类实例呢?
class T(object):
_i = 5
@property
def i(self):
return self.__class__._i
@i.setter(self, value)
self.__class__._i = value
当然,这并不会阻止用户使用实例的 _i
,而不是类的 _i
。
1
self.__class__.i
是正确的,肯定能工作(不过 i
这个名字起得不太好)。
如果你访问 i
的方法没有用到 self,你可以把它改成类方法,这样第一个参数就是类本身,而不是实例:
class T(object):
i = 5
@classmethod
def p(cls):
print cls.i
要读取这个属性,你也可以安全地使用 self.i
。但是如果你想改变它的值,使用 self.i = value
会改变实例的属性,这样就会遮盖掉这个实例的类属性。