4

CacheObject というクラスがあり、そこから多くのクラスが拡張されています。

今、このクラスのすべてのクラスに共通する何かを追加する必要があるので、これを書きます

class CacheObject(object):

    def __init__(self):
        self.updatedict = dict() 

しかし、子クラスはupdatedict属性を取得しませんでした。Pythonではスーパーinit関数の呼び出しがオプションであることは知っていますが、すべてのクラスをウォークして1つずつ変更するのではなく、強制的にすべてのクラスにinitを追加する簡単な方法はありますか? ?

4

5 に答える 5

3

これはあなたが求めたものupdatedictではありませんが、 で設定する必要がないように、プロパティを作成するのはどうですか__init__:

class CacheObject(object):
    @property
    def updatedict(self):
        try:
            return self._updatedict
        except AttributeError:
            self._updatedict = dict()
            return self._updatedict

これで、すべてのサブクラスに触れる必要がないという本当の目標が達成されることを願っています (updatedictもちろん、他の何かのために呼び出された属性を誰も使用しないようにすることを除いて)。

updatedictただし、質問の設定とは異なるため、奇妙な落とし穴がいくつかあり__init__ます。たとえば、 の内容CacheObject().__dict__が異なります。updatedict各インスタンスではなくクラスにキーを配置したため、キーはありません。

于 2013-09-26T22:45:05.283 に答える
1

オーバーライドできます__new__。基本クラスが__new__を呼び出さずにオーバーライドしない限り、問題ありませんsuper().__new__

class CacheObject(object):
    def __new__(cls, *args, **kwargs):
        instance = super().__new__(cls, *args, **kwargs)
        instance.updatedict = {}
        return instance

class Foo(CacheObject):
    def __init__(self):
        pass

ただし、一部のコメンターが言ったように、これの動機は少し怪しいようです. 代わりにスーパー コールを追加する必要があります。

于 2013-09-26T14:16:25.067 に答える