2 回答
TA贡献1813条经验 获得超2个赞
这需要重写Super.__new__以使其成为工厂函数。
class Super:
def __new__(cls, subclass_name, *args, **kwargs):
for sc in cls.__subclasses__():
if sc.__name__ == subclass_name:
return super().__new__(sc, *args, **kwargs)
raise ValueError("No such subclass")
class Sub1(Super):
pass
class Sub2(Super):
pass
assert type(Super('Sub1')) is Sub1
这需要更多的工作来允许您直接定义一个子类(就像Sub1()调用一样Super.__new__,因为Sub1.__new__没有定义)。
因此,我更喜欢采用类名的专用类方法,而不是覆盖__new__.
class Super:
@classmethod
def subclass_by_name(cls, name, *args, **kwargs):
for sc in cls.__subclasses__():
if sc.__name__ == name:
return sc(*args, **kwargs)
raise ValueError("No such subclass")
assert type(Super.subclass_by_name('Sub1')) is Sub1
TA贡献1895条经验 获得超3个赞
我真的不认为这是一个好主意。超类并不意味着作为可能子类的有限列表的容器,这几乎完全违背了继承的观点。如果我是你,我会创建一个简单的工厂,从中可以构造我想要的对象,例如:
class Fruit():
...
class Apple(Fruit):
...
class Pear(Fruit):
...
fruits = {
"apple": Apple,
"pear": Pear
}
def make_fruit(name, **kwargs):
return fruits[name](**kwargs)
apple = make_fruit("apple", colour="red")
pear = make_fruit("pear", size="small)
添加回答
举报