如何防止Python中类方法的属性被覆盖?
我有以下代码:
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