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. 我想要的是放置的实例CC._all对于 C 也是如此)。

我可以这样B定义C

class B(A):
    _all = set()

class C(A):
    _all = set()

这会奏效。然而,这感觉就像是重复代码,如果我在下一个_all子类时忘记添加A,或者拼写错误_alll,我可能很难调试错误。

我该如何做好这件事?

4

2 回答 2

4

设置_all并在if stillNone中创建您的设置,为每个班级提供自己的副本:__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 中, for 的定义A必须是:

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