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