如何防止Python中类方法的属性被覆盖?

0 投票
1 回答
1388 浏览
提问于 2025-04-16 22:59

我有以下代码:

class Test(object):

    _spam = 42

    @classmethod
    def get_spam(cls):
        cls._spam

    @classmethod
    def set_spam(cls, value):
        cls._spam = value

    spam = property(get_spam, set_spam)

print Test.spam
Test.spam = 24
print Test.spam

输出结果是:

<property object at 0x01E55BD0>
24

有没有办法防止设置 Test.spam 时覆盖这个属性?我不想用 Test.spam 来设置 Test._spam 的值。这个设置和获取的功能必须保持为类的方法,我也不想每次都调用 Test.set_spam

期望的输出结果应该是:

<property object at 0x01E55BD0>
<property object at 0x01E55BD0>

1 个回答

1

我想这可以防止开发者不小心覆盖了 Test 的 spam 属性。你是想要这个原因吗?我不太确定这样做是否好(如果开发者想要重写 spam 属性呢?为什么要设置障碍呢?),不过……

你可以使用元类。如果你不为元类的属性提供一个设置器,那么 Test.spam 就会引发一个属性错误:

class MetaTest(type):
    @property
    def spam(cls):
        return cls._spam

class Test(object):
    __metaclass__=MetaTest
    _spam = 42

    @classmethod
    def get_spam(cls):
        cls._spam

    @classmethod
    def set_spam(cls, value):
        cls._spam = value

    spam = property(get_spam, set_spam)

print Test.spam
# 42

但是

Test.spam = 24

会引发

AttributeError: can't set attribute

撰写回答