子类安全的类变量

时间:2011-07-18 13:32:40

标签: python

我能做到:

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 个答案:

答案 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属性。