2016-05-14 62 views
1

Python新手在这里。我在Eclipse上使用PyDev。Money和TypeError:__init __()需要1到2个位置参数,但有3个被给出

我正在编写一个程序来处理我的银行交易。我使用Money包(1.3.0)。直到我了解到,你可以创造货币的货币预设的变种(如on this page程序工作正常

当我用钱以下剪掉正常工作,但它给当我用我USD预设错误:

from money import Money 
class USD(Money): 
    def __init__(self, amount='0'): 
     super().__init__(amount=amount, currency='USD') 
a = Money(0,'USD') 
b = Money(-360,'USD') 
a += b 
print(a) 
c = USD(0) 
d = USD(-360) 
c += d 
print(c) 

(打印的真正目的()语句是一个方便的地方设置一个断点。)

我得到这个错误:

File "D:\Dev\mymoney\mymoney.py", line 11, in <module> 
    c += d 
File "C:\Program Files\Python35\lib\site-packages\money\money.py", line 119, in __add__ 
    return self.__class__(amount, self._currency) 
TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given 

我想知道如何修复我的代码,使其正常工作,但我需要了解问题所在。对于后者,无论是你的解释还是指向我可以学习的文档中的某些东西都是有帮助的。

回答

1

这是因为在source code here定义的__add__方法,一类新的返回通过两者amountself._currency__init__

def __add__(self, other): 
    if isinstance(other, Money): 
     if other.currency != self._currency: 
      raise CurrencyMismatch(self._currency, other.currency, '+') 
     other = other.amount 
    amount = self._amount + other 
    return self.__class__(amount, self._currency) 

但是,您的货币预设子类只消耗金额,而不是货币。因此,你传递了太多的位置参数。

对于货币预设(我的建议,我没有看到太多的一点),您的选择将不是Money的子类,请更改您的子类的__init__方法以接受为该子类的相应货币设置的默认参数,或者覆盖像__add__这样的方法,以便不将货币参数传递给__init__,而是通过具有类似return self.__class__(amount)的东西代替。不要做后者,这是没有必要的。

+0

因为我正在做的是完全按照文档,我决定尝试报告它作为一个错误。我了解到这是一个已知问题。请参阅https://github.com/carlospalol/money/issues/19。第20期是改善对单币种子支持的建议。由于我的知识水平不足以自己提交修复,所以我会保持简单,现在就使用非子类方法。 –

+0

令人费解的是,该消息提到__init__函数是问题所在。它指向的代码行是具有__class__的返回。我还没有在Python中学习过类,但是我发现__class__表示法指的是创建一个新的类实例,这可能会调用它的__init__函数。这是对的吗? –

+0

这是正确的,是的:)和'+ ='调用'__add__'的类,这是不重写的子类。 – miradulo

相关问题