我能做到:
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
..这是正确的,肯定会起作用吗?或者它可以在某些情况下产生意外行为(我不知道)?
答案 0 :(得分: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 :(得分:1)
self.__class__.i
是正确的并且确定有效(尽管i
是一个糟糕的命名选择)。
如果您访问i
的方法不使用self,则可以将其设为类方法,在这种情况下,第一个参数将是类而不是实例:
class T(object):
i = 5
@classmethod
def p(cls):
print cls.i
要阅读该属性,您也可以安全地使用self.i
。但是要更改其值,使用self.i = value
将更改实例的属性,屏蔽该实例的class属性。