1

假设我有一个基类如下:

class User:
    user_types = []
    def __init__(self, name, age):
        self.name = name
        self.age = age

然后我想创建一个子类,然后将其添加到 user_types

class Farmer(User):
    def harvest(self):
        print("%s just harvested his plantation!" %self.name)

现在我可以通过简单地说来实现我想要做的事情

User.user_types.append(Farmer)

但是,如果我希望它是自动的,并且为每个子类完成,我怎么能做到这一点呢?假设将有 400 个子类,手动为所有子类执行此操作会很痛苦。

4

2 回答 2

4

新样式类具有以下功能:

>>> User.__subclasses__()
[<class '__main__.Farmer'>]

如果您使用的是 Python 2.x,只需要User继承 from 。object

如果您需要每个子类的所有子类,您仍然可以使用以下方法避免元类:

def get_subclasses(c):
    subs = set(c.__subclasses__())
    return subs.union(*(get_subclasses(i) for i in subs))
于 2012-10-13T16:50:12.863 回答
2

您可以使用元类来解决您的问题:

class Meta(type):
    def __new__(meta, classname, bases, classDict):
        new_class = type.__new__(meta,classname,bases,classDict)
        for base in bases:
            if hasattr(base,'register'):
                base.register(new_class)
        return new_class

class Base(object):
    __metaclass__ = Meta

    subclasses = []

    @classmethod
    def register(cls,derived):
        cls.subclasses.append(derived)


class A(Base):
    pass

class B(A):
    pass

class C(Base):
    pass

print Base.subclasses

输出是:

[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>]
于 2012-10-13T16:53:43.930 回答