假設我有一個類Fruit和它的兩個子類Orange(Fruit)和Banana(fruit)
Fruit有一個初始化程式,我向它傳遞了一些引數。但我不希望它僅僅創建并回傳一個水果,而是根據傳遞給它的引數,可能回傳它的幾個不同子類之一。例如:
Fruit(color="yellow")可能會回傳一個Banana物件,而Fruit(color="orange")會回傳一個Orange.
我怎樣才能做到這一點?我不能這樣做,__init__因為該類已經創建。我試圖做它__new__,但這個傷口那些雜亂的,因為我可能會創建子類(如預期),但隨后會卷起recursivley呼叫父類的__new__。
我的解決方法是定義一個Fruit.create()靜態方法來創建適當的子類,但這似乎有點非 Pythonic。
有沒有“正確”的方法來做到這一點?
uj5u.com熱心網友回復:
我的觀點與 Chris Doyle 相同。
您可以使用工廠模式或您的Fruit.create(),我認為它們非常好
如果你想使用你的想法,你可以這樣做
class Meta(type):
def __call__(cls, *args, **kwargs):
if cls is Fruit:
color = kwargs.pop('color', None)
if color is None:
raise ValueError("missing keyword argument `color`")
match color:
case 'yellow':
return Banana()
case 'orange':
return Orange()
case _:
raise ValueError("invalid color: %s" % color)
return super().__call__(*args, **kwargs)
class Fruit(metaclass=Meta):
def __init__(self, *, color=None): # noqa
pass
class Banana(Fruit):
pass
class Orange(Fruit):
pass
if __name__ == '__main__':
print(Fruit(color='yellow'))
print(Fruit(color='orange'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/388943.html
上一篇:成功提交表單后如何關閉模態?
下一篇:合并每個用戶的陣列文本
