我当时正在写一个小的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上搜索了该解决方案,但找不到该类的解释说明。
请帮助我了解我在哪里弄错了...
答案 0 :(得分:1)
该问题是由于未在Exp类中正确定义print(middle)语句引起的。当您运行代码并且编译器运行脚本时,它会遇到此print(middle)行,该行未定义为Exp类的方法,但是尽管存在空格也可以作为内置函数执行。
如果尝试下面的代码,则会得到输出“ Out”和“ In”。您只能通过调用Exp.test()来获得“中间”
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)
def test(self):
print("Middle",x,y)
print("Out",x,y)
Exp(1,2)
答案 1 :(得分:1)
发生这种奇怪的行为是因为您的print("Middle",x,y)
不在函数的定义内,所以它在print("Out",x,y)
之前被调用。
执行此操作的可能“正确”方法之一是在构造函数中定义print("Middle",x,y)
语句。
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)
您将获得的输出是。
Out 5 3
In 1 2 1 2
Middle 1 2
以前的代码等效于
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
答案 2 :(得分:1)
您怀疑是正确的。我有六个月前一样的疑问,我的一个朋友帮助我找出了答案。
print("Middle",x,y)
以上陈述不属于任何方法。它属于类Exp
。 __init__()
方法在创建对象时执行,并在从您的一端实例化对象时由Python解释器内部调用。由于上述语句不是任何方法的一部分,因此解释器仅在调用__init__
方法之前执行它。由于变量x
和y
都在类Exp
的范围内定义,因此它不被认为是错误,解释器将其执行。
只需删除变量x
和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
和y
甚至不是从类Exp
的角度创建的。干杯!