gpt4 book ai didi

Python:如何在创建时向父类注册所有子类

转载 作者:太空狗 更新时间:2023-10-30 01:55:44 26 4
gpt4 key购买 nike

我有 python 类树,每个类树都由一个抽象基类和许多派生的具体类组成。我希望所有具体类都可以通过基类方法访问,并且我不想在子类创建期间指定任何内容。

这是我想象中的解决方案:

class BaseClassA(object):
# <some magic code around here>
@classmethod
def getConcreteClasses(cls):
# <some magic related code here>

class ConcreteClassA1(BaseClassA):
# no magic-related code here

class ConcreteClassA2(BaseClassA):
# no magic-related code here

尽可能地,我宁愿把“魔术”写成一种设计模式。我希望能够将它应用于不同场景中的不同类树(即添加具有“BaseClassB”及其具体类的类似树)。

感谢互联网!

最佳答案

你可以为此使用元类:

class AutoRegister(type):
def __new__(mcs, name, bases, classdict):
new_cls = type.__new__(mcs, name, bases, classdict)
#print mcs, name, bases, classdict
for b in bases:
if hasattr(b, 'register_subclass'):
b.register_subclass(new_cls)
return new_cls


class AbstractClassA(object):
__metaclass__ = AutoRegister
_subclasses = []

@classmethod
def register_subclass(klass, cls):
klass._subclasses.append(cls)

@classmethod
def get_concrete_classes(klass):
return klass._subclasses


class ConcreteClassA1(AbstractClassA):
pass

class ConcreteClassA2(AbstractClassA):
pass

class ConcreteClassA3(ConcreteClassA2):
pass


print AbstractClassA.get_concrete_classes()

我个人对这种魔法非常警惕。不要在你的代码中放太多这样的东西。

关于Python:如何在创建时向父类注册所有子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6730128/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com