2 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
這需要重寫(xiě)Super.__new__以使其成為工廠(chǎng)函數(shù)。
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
這需要更多的工作來(lái)允許您直接定義一個(gè)子類(lèi)(就像Sub1()調(diào)用一樣Super.__new__,因?yàn)镾ub1.__new__沒(méi)有定義)。
因此,我更喜歡采用類(lèi)名的專(zhuān)用類(lèi)方法,而不是覆蓋__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貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
我真的不認(rèn)為這是一個(gè)好主意。超類(lèi)并不意味著作為可能子類(lèi)的有限列表的容器,這幾乎完全違背了繼承的觀(guān)點(diǎn)。如果我是你,我會(huì)創(chuàng)建一個(gè)簡(jiǎn)單的工廠(chǎng),從中可以構(gòu)造我想要的對(duì)象,例如:
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)
添加回答
舉報(bào)