2009-08-27 5 views
2

Я пытаюсь получить класс из примитива python, float, для печати другой строки строки при ее распечатке.Доступ к базовому классу примитивного типа в 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 - это класс, который встроен. Пожалуйста, называйте их «встроенными» типами, а не «примитивными» типами. –

+0

Хорошо, хорошая точка. –

ответ

4

Если вы не отменяете __str__, что будет по-прежнему получить доступ к основному методу, так:

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

будет работать. В более общем плане вы можете использовать self+0, self*1 или любые другие манипуляции с идентификационными данными, которые вы явно не переопределили; если вы перевернули их все, в худшем случае, float.__add__(self, 0) или тому подобное.

+0

Спасибо, это заставляет его работать. Итак, «я» на самом деле относится к базовому номеру с плавающей запятой IEEE754, потому что я ничего не делал, чтобы с этим справиться? –

+0

'self' относится к« этому объекту »: любой метод, который вы не переопределили, перешел прямо к родительскому классу. Я также показал, как явно запрашивать реализацию родительского класса, если вы HAD переопределили все! -) –

+1

'% s' неявно вызывает' str'. Итак, вы делаете '% str (self)', который будет стандартным float .__ str__. Вы можете вернуться к нормальному поплавку, вызвав 'float', например:' e = efloat (9.3); f = float (e); print type (f) ' –

2

Вы можете вызывать методы базового класса, путем доступа к их базового класса, чтобы получить несвязанный метод и вызывать их с собой:

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

print(myfloat(4.5)) 
+0

Спасибо. Я получил его сейчас! –

Смежные вопросы