假设我有一个基类如下:
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个子类,那么为所有这些子类手动执行操作会很麻烦。
答案 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'>]