0

我有以下代码:

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. setter 和 getter 必须保留为类方法,我不想调用Test.set_spam.

输出应该是:

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

1 回答 1

1

我想这可以防止开发人员意外覆盖Test的垃圾邮件属性。这就是你想要这个的原因吗?我不确定这是一个好主意(如果开发人员想要覆盖垃圾邮件属性怎么办?为什么要设置路障?),但是......

您可以使用元类。如果您不为元类的属性提供设置器,那么Test.spam将引发 AttributeError:

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
于 2011-08-05T21:19:09.100 回答