Я хочу использовать класс Decimal в своей программе Python для финансовых расчетов. Десятичные числа не работают с числами с плавающей запятой - сначала требуется явное преобразование в строки. Поэтому я решил создать подкласс Decimal, чтобы иметь возможность работать с числами с плавающей запятой без явных преобразований.
m_Decimal.py:
# -*- coding: utf-8 -*-
import decimal
Decimal = decimal.Decimal
def floatCheck ( obj ) : # usually Decimal does not work with floats
return repr ( obj ) if isinstance ( obj, float ) else obj # this automatically converts floats to Decimal
class m_Decimal ( Decimal ) :
__integral = Decimal ( 1 )
def __new__ ( cls, value = 0 ) :
return Decimal.__new__ ( cls, floatCheck ( value ) )
def __str__ ( self ) :
return str ( self.quantize ( self.__integral ) if self == self.to_integral () else self.normalize () ) # http://docs.python.org/library/decimal.html#decimal-faq
def __mul__ ( self, other ) :
print (type(other))
Decimal.__mul__ ( self, other )
D = m_Decimal
print ( D(5000000)*D(2.2))
Итак, теперь вместо записи D(5000000)*D(2.2)
я должен написать D(5000000)*2.2
без исключения исключений.
У меня есть несколько вопросов:
Не вызовет ли мое решение неприятностей?
Повторная реализация
__mul__
не работает в случаеD(5000000)*D(2.2)
, потому что другой аргумент имеет типclass '__main__.m_Decimal'
, но вы можете увидеть в десятичном модуле это:
decimal.py, строка 5292:
def _convert_other(other, raiseit=False):
"""Convert other to Decimal.
Verifies that it's ok to use in an implicit construction.
"""
if isinstance(other, Decimal):
return other
if isinstance(other, (int, long)):
return Decimal(other)
if raiseit:
raise TypeError("Unable to convert %s to Decimal" % other)
return NotImplemented
Десятичный модуль ожидает, что аргумент будет Decimal или int. Это означает, что я должен сначала преобразовать свой объект m_Decimal в строку, а затем в Decimal. Но это много отходов - m_Decimal является потомком Decimal - как я могу использовать это, чтобы сделать класс быстрее (Decimal уже очень медленный).
- Когда появится cDecimal, будет ли работать этот подкласс?
isinstance
правильно учитывает подклассы...isinstance(d, m_Decimal)
подразумеваетisinstance(d, Decimal)
. - person Dirk   schedule 11.01.2010