2015-12-03 81 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

相關問題