使用python类执行的顺序

问题描述 投票:2回答:3

我正在编写一个小蟒蛇脚本来理解一个概念,并得到另一个混乱。这是代码 -

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”。但这里首先打印“中间”。这不应该发生,因为python解释器在第一次遇到“中间”时 - 它在定义范围内,因此不应该在那时执行。只有在读取调用类“Exp”的最后一行代码后才能执行它。

我在Google和StackOverflow上搜索了解决方案,但无法找到解释它的类。

请帮助我理解我弄错了...

python class interpreter order-of-execution
3个回答
1
投票

你怀疑是对的。 6个月前我有同样的疑问,我的一个朋友帮我解决了问题。

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类的角度创建的。干杯!


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

1
投票

问题是由于在Exp类中没有正确定义print(中间)语句。当您运行代码并且编译器运行脚本时,它会遇到此print(中间)行,该行未定义为Exp类的方法,但可作为内置函数执行,尽管有空格。

如果你尝试下面的代码,你会得到输出'Out'和'In'。你只能通过调用Exp.test()获得'Middle'

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)
© www.soinside.com 2019 - 2024. All rights reserved.