Python中的多态类,它返回另一个类的实例

时间:2015-12-03 11:56:38

标签: python class constructor polymorphism

我有类容器,可以将自己转换为另一个类。

例如,我有一些类型,例如MyFloat MyStrMyInt,提供其他方法或属性。我想将决定将这些类型构建到另一个类中:

我的第一次尝试是写下这个:

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

有可能实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

所以我发现这个解决方案有效。但是,我不知道这样做是否可以接受Pythonic。

class Polymorph(object):
    def __new__(cls, value):
        if isinstance(value, float):
            return MyFloat(value)
        elif isinstance(value, int):
            return MyInt(value)
        elif isinstance(value, str):
            return MyStr(value)
        else:
            raise TypeError, 'Unknown type'