我想定義一個類AorB,這樣所有的A都是AorB的,而所有的B都是AorB的,而這些都是AorB的。當然,A和B應該是AorB的子類。問題出在AorB.__init__
,當我無法說服自己它應該是別的東西。我可以定義一個AorB工廠,但如果可能的話,我寧願使用AorB構造函數。Python類的總和
class AorB:
def __init__(self,par):
if par: self=A(par) #!
else: self=B() #!
@staticmethod
def from_par(par):
if par: return A(par)
else: return B()
class A(AorB):
def __init__(self,par):
self.par=par
class B(AorB):
def __init__(self):
pass
print(
AorB.from_par(5),
AorB.from_par(0),
AorB(5),
AorB(0),
sep="\n")
我知道賦值給自己在這裏不起作用,但我只是想表現出意圖。正如我所說的,工廠(from_par)工作正常,我只想稱它爲AorB
,而不是AorB.from_par
。
PS。我知道,__init__
可能爲時已晚,自己的類型已經確定。隨意在你的答案中使用元類。我該學習一些有用的東西。 :-)
「工廠功能」對我來說不夠好。據我所知,你只是用def AorB覆蓋了AorB類。因此,實例(AorB(5),AorB)引發TypeError。 :-(我懷疑'__init__'已經太晚了,可以'__new__'和metaclasses有什麼幫助嗎? – Veky
@ user1875565:是的,但是更多的參與和醜陋 –
醜陋在於觀察者眼中。:-) One更多的問題:可以通過讓A和B自己調用'super().__ new__'的'__new__'來避免'_constructing'?另外,我寧願不使用默認參數,真實情況更復雜,A和B構造函數已經使用它們的「None」的公平份額。 :-) – Veky