子类安全的类变量

3 投票
2 回答
1114 浏览
提问于 2025-04-16 21:46

我可以这样做:

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 会改变实例的属性,这样就会遮盖掉这个实例的类属性。

撰写回答