2012-06-11 54 views
1

我想,一個類,其實例調用的時候直接就好像他們從整型,浮點,STR繼承返回值等我想象它的一些重載函數???實例返回值(不是實例)時直接調用

class A(object): 
    def __init__(self, value): 
     self.value = value 

    def somefunction(self): 
     if isintance(self.value, int): 
      return 5 
     else: 
      return 'something else' 

    def __???__(self): 
     return self.value 

a = A(2) 
a + 5 # 7 
a.somefunction() # 5 

a = A('foo') 
a + "bar" # 'foobar' 
a.somefunction() # 'something else' 

我不能簡單地子INT的值可以是不同類型的。

這是可行的嗎?也許有一個很好的理由,這是無法完成的,但已經很晚了,我想不起來。提前致謝。

回答

1

重寫__getattr__不會因爲元類的混亂工作;問題是相關的方法需要在實例的類詞典中。

如果你滿意的value是不可改變的,一種方法可以重寫__new__,構建按需類:

def __new__(cls, value): 
    return type("A", (type(value), A), {})(value) 

注意,這使A在MRO type(value)後;這是必要的,以阻止__new__導致失控遞歸!如果有關於A方法應該覆蓋那些type(value),你可以把它們放進字典第三個參數來type()

0

您可以使用a.value + 'bar',或者你可以定義__add__方法

class A(object): 
    def __init__(self, value): 
     self.value = value 

    def __add__(self, arg): 
     return self.value + arg 


a = A(2) 
print a + 5   # 7 

a = A('foo') 
print a.value + "bar" # 'foobar' 
print a + "bar"  # 'foobar' 

Python函數和方法是一種通用(你可以認爲C++模板的相似性)。例如,+運算符可用於數字類型和字符串。你不能混合類型;但是,操作數的類型檢查是在動作執行時動態完成的。這樣,__add__方法適用於整數和字符串(以及複雜和浮點...)。

如果要打印時(即,不執行所述+操作)時顯示實例的值,可以定義__str__方法:

def __str__(self): 
     return str(self.value) 
+0

'打印了'不會打印'2'或'foo',但是。我不確定OP是否可以。 –

+0

@Lev Levitsky:這是一個不同的要求。 'print'將對象轉換爲可讀的字符串。您可以使用'__repr__'方法將對象轉換爲* technical *字符串表示形式,或使用'__str__'方法將其轉換爲*可讀*字符串表示形式。 '__str__'方法被'print'自動調用,或者你可以使用內建的'str()'函數調用'__str__'。 – pepr

+1

我理解這個問題的方式是'了'應該在任何情況下_evaluate to_'2'(或''foo''),無論是增加還是其他什麼東西。 –