请看下面的内容:
a = 5
print a + b
b = 4
当我尝试运行上面的代码时,它会出错: Traceback(最近一次调用最后一次): 文件“C:/Users/user/Documents/modules/ab.py”,第2行,in 打印a + b NameError:名称'b'未定义
确定。在a + b
定义之前调用b
。这意味着Python按顺序运行代码,从上到下开始。
但是,这个怎么样:
class Data:
def __init__(self):
self.debug_level = 9
self.assign = [0, 0, 0, 0]
self.days = 0
def create_days(self, startTime, endTime):
res = 0
try:
if self.final_days < self.maximum_days:
上面,self.final_days
和self.maximum_days
也没有定义,但它没有给出任何错误。它背后的逻辑是什么?
致以最诚挚的问候,
答案 0 :(得分:5)
你还没有真正“运行”代码。在您的示例中,您拥有的只是Data类中的方法声明。在其中,Python不会检查类字段是否存在,因为它们可能在其他时间设置,在某些其他方法中(Python的类在这种意义上是可塑的)。
如果您尝试在Data类的新实例中运行create_days方法而不事先设置这些字段的值,则会出现错误。
答案 1 :(得分:4)
它不会产生任何错误,因为在定义类时不会访问属性。一旦拨打create_days()
,您就会遇到问题:D
答案 2 :(得分:2)
只有在调用函数时,才会对函数体进行求值,而不是在定义它时。
答案 3 :(得分:1)
仅在运行代码时查找引用。您可以在create_days()
方法中放置您喜欢的任何名称,并且在执行包含它们的行之前不会检查任何名称。
答案 4 :(得分:1)
如果你真的执行了它,你会得到的 AttributeError:数据实例没有属性'final_days'
重现这一点:
x = Data()
x.create_days(1,2)
另外,你有一个try
块。我假设这是其他一些代码的摘录。 try块可能会吞噬异常。
答案 5 :(得分:0)
Python是一种解释型语言,与c ++不同,它不会被编译,因此在调用函数体之前不会对其进行求值。