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。セッターとゲッターはクラス メソッドのままにしておく必要があり、呼び出す必要はありません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 に答える