python - python类的执行顺序

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

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

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

最佳答案

你的怀疑是对的。 6 个月前我也有同样的疑问,我的一个 friend 帮我找到了答案。

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 的角度创建的。

关于python - python类的执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55793567/

相关文章:

Jquery - 滚动时如何制作菜单按钮 removeClass?

interpreter - AST解释器?

python - celery (4.2): how to get task id for current task

python - 将稀疏数据输入到 Tensorflow Estimator 中进行拟合

python - 如何在python中将一个csv拆分为多个文件

javascript - 如何在 Javascript 中创建类?

python - 以链的形式执行列表中的函数

ios - 如何在实例方法中调用类型方法

python - 将 Python 项目传输到不同的计算机

c - 如何编写链接器