python类的执行顺序

时间:2019-04-22 11:20:57

标签: python class interpreter order-of-execution

我当时正在写一个小的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上搜索了该解决方案,但找不到该类的解释说明。

请帮助我了解我在哪里弄错了...

3 个答案:

答案 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__方法之前执行它。由于变量xy都在类Exp的范围内定义,因此它不被认为是错误,解释器将其执行。

只需删除变量xy的声明。而且您会在下面看到类似NameError的内容。

Traceback (most recent call last):
  File "trial.py", line 9, in <module>
    print("Middle",x,y)
NameError: name 'x' is not defined

这是因为xy甚至不是从类Exp的角度创建的。干杯!