我一直在寻找这个问题的答案,但我找不到答案,它可能太具体了。
我有一个简单的程序,我的第一个合适的程序,我创建它主要是为了练习:
import math
class Logs(object):
def __init__(self,a,b):
self.a = a
self.b = b
def apply_log(self):
self.a_log = math.log10(self.a)
self.b_log = math.log10(self.b)
return (self.a_log, self.b_log)
def add_log(self):
self.log_add = self.a_log + self.b_log
return self.log_add
def log_split(self):
self.log_c = self.log_add // 1
self.log_m = self.log_add % 1
return(self.log_c, self.log_m)
def result(self):
self.ex_m = 10 ** self.log_m
self.ex_v = 10 ** self.log_c
self.log_res = self.ex_m * self.ex_v
return self.log_res
lg = Logs(34,54)
#print(lg.apply_log())
#print(lg.add_log())
#print(lg.log_split())
print(lg.result())当我取消所有print语句的注释并同时运行它们时,程序运行得很好。但是,如果我只想打印实例的结果并注释掉其他三个print语句,则会抛出一个错误:
Traceback (most recent call last):
File "python", line 33, in <module>
File "python", line 24, in result
AttributeError: 'Logs' object has no attribute 'log_m'我不明白为什么在打印每个方法的结果时它会起作用,或者为什么这会影响程序的运行方式。
现在我还要说,这是我第一次使用类(程序的重点是练习创建类),所以我认为错误出在我创建它的方式上。
任何帮助都将不胜感激!
谢谢
发布于 2017-03-13 21:19:44
它必须抛出AttributeError,因为log_m是在log_split方法中初始化的,并在result方法中使用。如果您在没有调用log_split的情况下调用result,则未定义log_m,并且您将看到所看到的错误。这个类的设计方式是,只有在log_split之后才能调用result。
发布于 2017-03-13 21:21:58
log_m是log_split(self)函数中的一个局部变量。
因此,在result(self)函数中,log_m和log_c是函数未知的两个变量。
所以你必须先运行log_split(),然后再运行result()。
发布于 2017-03-13 21:26:50
log_m的值是在log_split方法中初始化的,它依赖于在add_log方法中初始化的log_add的值。此外,log_add依赖于在apply_log方法中初始化的a_log和b_log的值。因此,当您注释方法的所有三个实现时,它会显示AttributeError。你必须保持方法调用的顺序,否则注释任何一个方法都会导致错误。
https://stackoverflow.com/questions/42764614
复制相似问题