我正在编写一个小的 python 脚本来理解一个概念,但又遇到了另一个困惑。这是代码 -
x = 5
y = 3
class Exp(object):
def __init__(self, x, y):
self.x = x
self.y = y
print("In",x, y, self.x, self.y)
print("Middle",x,y)
print("Out",x,y)
Exp(1,2)
输出是 -
Middle 5 3
Out 5 3
In 1 2 1 2
现在,我的概念是 python 解释器开始读取并执行从第一行到最后一行的代码。它执行代码在班级内仅当它被“调用”时,而不是当它被定义时。因此,输出应该首先打印“Out”。但这里首先打印“Middle”。这种情况不应该发生,因为 python 解释器第一次遇到“Middle”时 - 它在定义范围内,因此当时不应该执行。它应该仅在读取调用类“Exp”的最后一行代码后执行。
我在 Google 和 StackOverflow 上搜索了解决方案,但找不到为课程解释的解决方案。
请帮助我理解我哪里错了......
你的怀疑是对的。六个月前我也有同样的疑问,我的一个朋友帮我找到了答案。
print("Middle",x,y)
上述语句不属于任何方法。它属于班级Exp
. The __init__()
方法在创建对象时执行,并在从您端实例化对象时由 Python 解释器内部调用。由于上述语句不是任何方法的一部分,因此解释器在调用之前执行它__init__
方法。由于变量x
and y
都在类的范围内可用Exp
,它不被视为错误并且解释器会执行它。
如果删除变量的声明x
and y
,你会看到一个NameError
像下面这样。
Traceback (most recent call last):
File "trial.py", line 9, in <module>
print("Middle",x,y)
NameError: name 'x' is not defined
这是因为x
and y
甚至不是从类中创建的Exp
的观点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)