0
我有類容器可以將自己轉換爲另一個類。Python中的多態類返回另一個類的實例
例如,我有一些類型,如MyFloat
MyStr
或MyInt
提供了其他方法或屬性。我想封裝建立這些類型的到另一個類的決定:
我第一次嘗試寫這樣的:
class MyFloat(float):
def foo_float():
pass
class MyStr(str):
def foo_str():
pass
class MyInt(int):
def foo_int():
pass
# Does not work
class Polymorph(object):
def __init__(self, value):
if isinstance(value, float):
self = MyFloat(value)
elif isinstance(value, int):
self = MyInt(value)
elif isinstance(value, str):
self = MyStr(value)
else:
raise TypeError, 'Unknown type'
不幸的是,我沒有得到在年底預期的實例:
>>> a = Polymorph(42.42) # Should get an instance of MyFloat
>>> type(a)
__main.MyFloat
然後我試圖用__new__
代替
class Polymorph(object):
def __new__(cls, value):
if isinstance(value, float):
return super(MyFloat, cls).__new__(cls, value)
elif isinstance(value, int):
return super(MyInt, cls).__new__(cls, value)
elif isinstance(value, str):
return super(MyStr, cls).__new__(cls, value)
else:
raise TypeError, 'Unknown type'
但是,這一次我得到一個TypeError: super(type, obj): obj must be an instance or subtype of type
是否有可能實現這一目標?
我會說它並不總是蟒蛇般的方式。使用下劃線方法是允許的黑客行爲。你隱藏了一些邏輯,但[Python的禪](https://www.python.org/dev/peps/pep-0020/)說:'顯式比隱式更好。如果你不介意,我認爲使用工廠函數而不是類會更好:'def get_myclass(value)' – baldr