python类的执行顺序

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


我在 Google 和 StackOverflow 上搜索了解决方案,但找不到为课程解释它的解决方案。


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


阿晨1998
浏览 460回答 3
3回答

交互式爱情

你的怀疑是对的。6 个月前我也有同样的疑问,我的一个朋友帮我找出了答案。print("Middle",x,y)以上说法不属于任何方法。它属于类Exp。该__init__()方法在创建对象时执行,并在从您端实例化对象时由 Python 解释器在内部调用。由于上述语句不是任何方法的一部分,解释器在调用__init__方法之前执行它。由于变量x和y都在 class 的范围内可用Exp,因此它不被视为错误,解释器会执行它。如果您删除变量x和的声明y,您将看到NameError如下所示。Traceback (most recent call last):&nbsp; File "trial.py", line 9, in <module>&nbsp; &nbsp; print("Middle",x,y)NameError: name 'x' is not defined这是因为x并且y甚至不是从 classExp的角度创建的。

慕的地6264312

发生这种奇怪的行为是因为您print("Middle",x,y)不在函数的定义中,所以它被调用 before print("Out",x,y)。您的代码相当于:x = 5y = 3class Exp(object):&nbsp; &nbsp; def __init__(self, x, y):&nbsp; &nbsp; &nbsp; &nbsp; self.x = x&nbsp; &nbsp; &nbsp; &nbsp; self.y = y&nbsp; &nbsp; &nbsp; &nbsp; print("In",x, y, self.x, self.y)print("Middle",x,y)print("Out",x,y)&nbsp;Exp(1,2)谁的输出将是:Middle 5 3Out 5 3In 1 2 1 2纠正此问题的一种可能方法是print("Middle",x,y)在构造函数中定义 。x = 5y = 3class Exp(object):&nbsp; &nbsp; def __init__(self, x, y):&nbsp; &nbsp; &nbsp; &nbsp; self.x = x&nbsp; &nbsp; &nbsp; &nbsp; self.y = y&nbsp; &nbsp; &nbsp; &nbsp; print("In",x, y, self.x, self.y)&nbsp; &nbsp; &nbsp; &nbsp; print("Middle",x,y)print("Out",x,y)&nbsp;Exp(1,2)然后您将获得的输出是:Out 5 3In 1 2 1 2Middle 1 2

慕码人2483693

类方法不会在编译时执行,它们必须被调用。上面的代码中的 print(middle) 语句未在类方法中定义。而 print(In) 语句是在init(也称为构造函数)方法中定义的。当您运行代码并且编译器运行脚本时,在调用init () 方法之前不会调用 print(In) 语句。但是,此 print(middle) 行并未定义为 Exp 类的方法,而是作为内置函数执行,尽管有空格。因此,当 Python 编译 Exp 类时,会调用 print(middle) 语句。这是唯一一次调用 print(middle) 语句。由于它不在类方法中,因此以后无法在程序中访问它。如果您尝试下面的代码,您会得到输出“Out”和“In”。您只能通过调用 Exp.test() 获得“中间”x = 5y = 3class Exp(object):&nbsp; &nbsp; def __init__(self, x, y):&nbsp; &nbsp; &nbsp; &nbsp; self.x = x&nbsp; &nbsp; &nbsp; &nbsp; self.y = y&nbsp; &nbsp; &nbsp; &nbsp; print("In",x, y, self.x, self.y)&nbsp; &nbsp; def test(self):&nbsp; &nbsp; &nbsp; &nbsp; print("Middle",x,y)&nbsp;&nbsp;print("Out",x,y)Exp(1,2)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python