【问题标题】:Add subclass to super class' list when subclass is created in Python?在 Python 中创建子类时将子类添加到超类列表中?
【发布时间】:2012-10-13 16:01:20
【问题描述】:

假设我有一个基类如下:

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 个子类,手动为所有子类执行此操作会很痛苦。

【问题讨论】:

    标签: python class subclass superclass


    【解决方案1】:

    新样式类具有以下功能:

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

    只需要让User 继承自object,以防您使用的是 Python 2.x。

    如果你需要每个子类的所有子类,你仍然可以用这个来避免元类:

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

    【讨论】:

      【解决方案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'>]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-09
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2019-03-12
        • 2016-05-07
        相关资源
        最近更新 更多