3

我正在编写一个小的 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 上搜索了解决方案,但找不到为课程解释它的解决方案。

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

4

3 回答 3

3

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

print("Middle",x,y)

以上说法不属于任何方法。它属于类Exp。该__init__()方法在创建对象时执行,并在从您端实例化对象时由 Python 解释器在内部调用。由于上述语句不是任何方法的一部分,解释器在调用__init__方法之前执行它。由于变量xy都在 class 的范围内可用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甚至不是从 classExp的角度创建的。

于 2019-04-22T11:48:40.657 回答
2

发生这种奇怪的行为是因为您print("Middle",x,y)不在函数的定义中,所以它被调用 before print("Out",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)

谁的输出将是:

Middle 5 3
Out 5 3
In 1 2 1 2

纠正此问题的一种可能方法是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
于 2019-04-22T11:42:13.723 回答
0

类方法不会在编译时执行,它们必须被调用。

上面的代码中的 print(middle) 语句未在类方法中定义。而 print(In) 语句是在init(也称为构造函数)方法中定义的。

当您运行代码并且编译器运行脚本时,在调用init () 方法之前不会调用 print(In) 语句。

但是,此 print(middle) 行并未定义为 Exp 类的方法,而是作为内置函数执行,尽管有空格。因此,当 Python 编译 Exp 类时,会调用 print(middle) 语句。这是唯一一次调用 print(middle) 语句。由于它不在类方法中,因此以后无法在程序中访问它。

如果您尝试下面的代码,您会得到输出“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)
于 2019-04-22T11:31:38.653 回答