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から継承する必要があります。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 に答える