3 回答

TA贡献1712条经验 获得超3个赞
你的怀疑是对的。6 个月前我也有同样的疑问,我的一个朋友帮我找出了答案。
print("Middle",x,y)
以上说法不属于任何方法。它属于类Exp。该__init__()方法在创建对象时执行,并在从您端实例化对象时由 Python 解释器在内部调用。由于上述语句不是任何方法的一部分,解释器在调用__init__方法之前执行它。由于变量x和y都在 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的角度创建的。

TA贡献1817条经验 获得超6个赞
发生这种奇怪的行为是因为您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

TA贡献1860条经验 获得超9个赞
类方法不会在编译时执行,它们必须被调用。
上面的代码中的 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)
添加回答
举报