python代码 - 速率计算。我怎样才能使这段代码正确?

时间:2018-05-03 14:34:44

标签: python

我自己学习了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__())

4 个答案:

答案 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==0ratemoney == 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.ratemoneyself.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,因此您的类应命名为RatecalcRateCalc。此外,特殊方法(具有两个前导和两个最终下划线的方法)不是直接调用,而是通过运算符或通用的“类似运算符”函数调用。在您的情况下,您应该使用

print(str(a))

而不是

print(a.__str__())

答案 3 :(得分:0)

你在定义var之前使用了self.ratemoney,那是因为你创建了类的实例,然后使用方法 str 返回self.ratemoney但是这个属性没有定义直到你使用方法calc。 您可以在 init 方法中定义self.ratemoney,或在使用 str 之前使用calc方法。