| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 | # -*- coding: utf-8 -*-#!/usr/bin/env pythonfrom functools import total_orderingfrom bson.decimal128 import Decimal128from apilib.numerics import force_decimal, UnitBase, quantize@total_orderingclass Quantity(UnitBase):    """    主要用来记录消费的数额    """    def __init__(self, amount, places='0.0001'):        if isinstance(amount, Quantity):            self._amount = amount.amount        self._amount = quantize(force_decimal(amount), places=places)    @property    def amount(self):        return self._amount    @property    def mongo_amount(self):        return Decimal128(self._amount)    def _format(self, string):        # type:(str)->str        return string.format(type=self.__class__.__name__)    def __str__(self):        return u'{amount}'.format(amount=self._amount)    def __repr__(self):        return '{type} {amount}'.format(type=self.__class__.__name__, amount=self._amount)    def __eq__(self, other):        if isinstance(other, Quantity):            return self._amount == other._amount        else:            raise TypeError(self._format('{type} can only be compared(__eq__) with another {type}'))    def __lt__(self, other):        if isinstance(other, Quantity):            return self._amount < other._amount        else:            raise TypeError(self._format('{type} can only be compared(__lt__) with another {type}'))    def __mul__(self, other):        if isinstance(other, Quantity):            raise TypeError(self._format('{type} cannot be multiplied by {type}'))        else:            return self.__class__(self.amount * other)    def __div__(self, other):        if isinstance(other, Quantity):            raise TypeError(self._format('{type} cannot be divided by {type}'))        else:            return self.__class__(self.amount / other)    def __add__(self, other):        if isinstance(other, Quantity):            return self.__class__(self._amount + other._amount)        else:            raise TypeError(self._format('{type} cannot be added to {type}'))    def __sub__(self, other):        if isinstance(other, Quantity):            return self.__class__(self._amount - other._amount)        else:            raise TypeError(self._format('{type} cannot be subtracted to {type}'))    def __float__(self):        return float(self.amount)
 |