Предотвратить переопределение свойства для методов класса в Python? - PullRequest
0 голосов
/ 06 августа 2011

У меня есть следующий код:

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 голос
/ 06 августа 2011

Полагаю, это мешает разработчикам случайно перезаписать свойство 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
...