2
class A(object):
    _all = set()

    def __new__(cls):
        obj = super(A,cls).__new__(cls)
        cls._all.add(obj)
        return obj

class B(A):
    pass

class C(A):
    pass

b = B()
c = C()

これにより、すべてのインスタンスが作成され、に配置されA._allます。私が欲しいのは、のインスタンスをC配置することですC._all(Cの場合も同様です)。

私はこれを定義BしてC好きにすることができます:

class B(A):
    _all = set()

class C(A):
    _all = set()

どちらがうまくいくでしょう。ただし、これはコードを繰り返すように感じます。次に_allサブクラス化するときに追加するのを忘れAたり、スペル_alllを間違えたりすると、エラーのデバッグが難しくなる可能性があります。

これをうまくやるにはどうすればよいですか?

4

2 に答える 2

4

それでも設定してセット_allNone作成し、各クラスに独自のコピーを提供します。__new__None

class A(object):
    _all = None

    def __new__(cls):
        obj = super(A,cls).__new__(cls)
        if cls._all is None:
            cls._all = set()
        cls._all.add(cls)
        return obj
于 2012-05-23T15:30:26.233 に答える
3

そのメタクラスは次のとおりです。

class make_all_meta(type):
   def __init__(cls, name, bases, dic):
       type.__init__(cls, name, bases, dic)
       cls._all = set()

class A(object):
    __metaclass__ = make_all_meta

Python 3では、の定義は次のようにするA必要があります。

class A(metaclass=make_all_meta):
    pass
于 2012-05-23T15:54:00.143 に答える