我自己学习了2周的python!而且我了解了自我'因此,我想使用' self'来制作费率计算代码。但我经常遇到错误。最后一个错误是" ratecalc对象没有属性' ratemoney'"。我理解字面上的错误,但我不知道解决这个问题。我怎样才能做到这一点?有没有提示?
class ratecalc(object):
def __init__(self, initmoney, day, rate):
self.initmoney=initmoney
self.day=day
self.rate=rate
def calc(self):
self.ratemoney=self.initmoney+self.initmoney*rate*day
return self.ratemoney
def __str__(self):
return('%.2f $ in %i days, rate was %i ,total is %s'%\
(self.initmoney, self.day, self.rate, self.ratemoney))
输入和打印代码就是这些。
a=ratecalc(10000, 7, 0.001)
print(a.__str__())
答案 0 :(得分:0)
在使用之前,您必须将 ratemoney 放入初始化程序。
class ratecalc(object):
def __init__(self, initmoney, day, rate):
self.initmoney=initmoney
self.day=day
self.rate=rate
self.ratemoney = None #You have to initialise this before you use it
def calc(self):
self.ratemoney=self.initmoney+self.initmoney*rate*day
return self.ratemoney
def __str__(self):
return('%.2f $ in %i days, rate was %i ,total is %s'%\
(self.initmoney, self.day, self.rate, self.ratemoney))
答案 1 :(得分:0)
由于您未在ratemoney
方法中创建属性__init__
,因此在调用__str__
方法时尚未创建属性,因此错误。解决方案是使用None
值在init中实例化属性,但在这种情况下,当day==0
,ratemoney == initmoney
时,应该是实例化的值:
class ratecalc(object):
def __init__(self, initmoney, day, rate):
self.initmoney=initmoney
self.day=day
self.rate=rate
self.ratemoney=initmoney
def calc(self):
self.ratemoney=self.initmoney+self.initmoney*rate*day
return self.ratemoney
def __str__(self):
return('%.2f $ in %i days, rate was %i ,total is %s'%\
(self.initmoney, self.day, self.rate, self.ratemoney))
答案 2 :(得分:0)
self.ratemoney
由self.calc()
设置,因此在您实际调用.calc()
之前它不存在。由于您之前致电a.__str__()
,__str__
取决于self.ratemoney
,因此确实存在属性错误。
一个简单的解决方案是在self.calc()
中调用__init__
,因此始终定义self.ratemoney
,但此值取决于其他三个属性,因此,如果您更改其中任何一个属性,那么在ratemoney
中有陈旧价值。
第二个(更好)解决方案是根本不存储该值并使用self.calc()
中的__str__
:
def str (自我): return('%。2f $ in%i天,费率为%i,总数为%s'%\ (self.initmoney,self.day,self.rate,self.calc()))
如果计算成本是一个问题(但不应该在这里),有一些解决方案可以保留计算值的本地缓存,并在另一个属性发生变化时使其无效,但我认为你不必担心那些事情现在。
作为旁注:Python的编码风格为类名推荐CamelCase,因此您的类应命名为Ratecalc
或RateCalc
。此外,特殊方法(具有两个前导和两个最终下划线的方法)不是直接调用,而是通过运算符或通用的“类似运算符”函数调用。在您的情况下,您应该使用
print(str(a))
而不是
print(a.__str__())
答案 3 :(得分:0)
你在定义var之前使用了self.ratemoney,那是因为你创建了类的实例,然后使用方法 str 返回self.ratemoney但是这个属性没有定义直到你使用方法calc。 您可以在 init 方法中定义self.ratemoney,或在使用 str 之前使用calc方法。