2009-08-27 15 views
2

我想從python原始類型的浮點數中派生出一個類,用於打印出不同的repr字符串。在python中訪問基類的原始類型

當我這樣做時,如何從派生類訪問基礎數據?

這裏是什麼,我試圖做一個簡單的例子:

class efloat(float): 
    def __repr__(self): 
     return "here's my number: %s" % str(WHAT CAN I PUT HERE???) 

好的,謝謝鄉親!我想我現在明白了。下面是任何人下課誰是好奇:

import math 

class efloat(float): 
    """efloat(x) -> floating point number with engineering representation when printed 
     Convert a string or a number to a floating point number, if possible. 
     When asked to render itself for printing (via str() or print) it is normalized 
     to engineering style notation at powers of 10 in multiples of 3 
     (for micro, milli, kilo, mega, giga, etc.)   
    """ 

    def _exponent(self): 
     if self == 0.0: 
      ret = 0 
     else: 
      ret = math.floor(math.log10(abs(self))) 
     return ret 

    def _mantissa(self): 
     return self/math.pow(10, self._exponent()) 

    def _asEng(self): 
     shift = self._exponent() % 3 

     retval = "%3.12ge%+d" % (self._mantissa()*math.pow(10, shift), self._exponent() - shift) 
     return retval 

    def __str__(self): 
     return self._asEng() 

    def __repr__(self): 
     return str(self) 

    def __add__(self, x): 
     return efloat(float.__add__(self, float(x))) 

    def __radd__(self, x): 
     return efloat(float.__add__(self, float(x))) 

    def __mul__(self, x): 
     return efloat(float.__mul__(self, float(x))) 

    def __rmul__(self, x): 
     return efloat(float.__mul__(self, float(x))) 

    def __sub__(self, x): 
     return efloat(float.__sub__(self, float(x))) 

    def __rsub__(self, x): 
     return efloat(float.__rsub__(self, float(x))) 

    def __div__(self, x): 
     return efloat(float.__div__(self, float(x))) 

    def __rdiv__(self, x): 
     return efloat(float.__rdiv__(self, float(x))) 

    def __truediv__(self, x): 
     return efloat(float.__truediv__(self, float(x))) 

    def __rtruediv__(self, x): 
     return efloat(float.__rtruediv__(self, float(x))) 

    def __pow__(self, x): 
     return efloat(float.__pow__(self, float(x))) 

    def __rpow__(self, x): 
     return efloat(float.__rpow__(self, float(x))) 

    def __divmod__(self, x): 
     return efloat(float.__divmod__(self, float(x))) 

    def __neg__(self): 
     return efloat(float.__neg__(self)) 

    def __floordiv__(self, x): 
     return efloat(float.__floordiv__(self, float(x))) 
+0

沒有Java風格(或C++風格),「原始」類型。 float是一個內置的類。請將它們稱爲「內置」類型,而不是「原始」類型。 – 2009-08-27 10:05:23

+0

好的,好點。 – 2009-08-27 18:04:46

回答

4

如果不重寫__str__,將仍然可以訪問底層方法,所以:

class efloat(float): 
    def __repr__(self): 
     return "here's my number: %s" % self 

會工作。更一般地,您可以使用self+0self*1或您未明確覆蓋的任何其他身份操作;如果你把它們全部覆蓋,最壞的情況下,float.__add__(self, 0)或類似的。

+0

謝謝,這使它工作。所以「自我」實際上指的是底層的IEEE754浮點數,因爲我沒有做任何事情來彌補這一點? – 2009-08-27 04:42:43

+0

'self'指的是「這個對象」:任何你沒有覆蓋的方法都會直接進入父類。我還展示瞭如果你已經忽略了所有內容,如何明確地請求父類的實現!) – 2009-08-27 04:57:18

+1

'%s'隱式調用'str'。所以你在做'%str(self)',它將是標準的float .__ str__。你可以通過調用'float'返回到正常的float,例如:'e = efloat(9.3); f = float(e);打印類型(f)' – 2009-08-27 05:00:10

2

你可以調用基類的方法,通過訪問他們遠離基類來獲得一個不受約束的方法,並用自己的呼叫他們:

class myfloat(float): 
    def __str__(self): 
     return "My float is " + float.__str__(self) 

print(myfloat(4.5)) 
+0

謝謝。我現在開始工作了! – 2009-08-27 17:57:43