在Python中创建子类时,将子类添加到超类的列表中?

时间:2012-10-13 16:01:20

标签: python class subclass superclass

假设我有一个基类如下:

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个子类,那么为所有这些子类手动执行操作会很麻烦。

2 个答案:

答案 0 :(得分:4)

新样式类具有此功能:

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

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

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

def get_subclasses(c):
    subs = set(c.__subclasses__())
    return subs.union(*(get_subclasses(i) for i in subs))

答案 1 :(得分: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'>]