2015-12-03 82 views
0

我有类容器可以将自己转换为另一个类。Python中的多态类返回另一个类的实例

例如,我有一些类型,如MyFloatMyStrMyInt提供了其他方法或属性。我想封装建立这些类型的到另一个类的决定:

我第一次尝试写这样的:

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

所以我发现了这个解决方案,它的工作原理。但是,我不知道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'  
+1

我会说它并不总是蟒蛇般的方式。使用下划线方法是允许的黑客行为。你隐藏了一些逻辑,但[Python的禅](https://www.python.org/dev/peps/pep-0020/)说:'显式比隐式更好。如果你不介意,我认为使用工厂函数而不是类会更好:'def get_myclass(value)' – baldr

相关问题