1. ホーム
  2. python

[解決済み] init__ の外側で新しい属性を作成しないようにする。

2023-01-09 15:30:53

質問

Pythonで)クラスを作りたいのですが、一旦 __init__ で初期化されると、新しい属性は受け付けませんが、既存の属性の修正は受け付けます。これを行うには、いくつかのハック的な方法があります。 __setattr__ メソッドを使うなどです。

def __setattr__(self, attribute, value):
    if not attribute in self.__dict__:
        print "Cannot set %s" % attribute
    else:
        self.__dict__[attribute] = value

を編集し、さらに __dict__ の中に直接 __init__ の中にあるのですが、これを行うための「適切な」方法があるのでしょうか?

どのように解決するのですか?

私なら __dict__ を直接使用することはありませんが、インスタンスを明示的に "freeze" するための関数を追加することができます。

class FrozenClass(object):
    __isfrozen = False
    def __setattr__(self, key, value):
        if self.__isfrozen and not hasattr(self, key):
            raise TypeError( "%r is a frozen class" % self )
        object.__setattr__(self, key, value)

    def _freeze(self):
        self.__isfrozen = True

class Test(FrozenClass):
    def __init__(self):
        self.x = 42#
        self.y = 2**3

        self._freeze() # no new attributes after this point.

a,b = Test(), Test()
a.x = 10
b.z = 10 # fails