为了账号安全,请及时绑定邮箱和手机立即绑定

python类的执行顺序

python类的执行顺序

阿晨1998 2022-01-18 16:25:58
我正在编写一个小的 python 脚本来理解一个概念,但又遇到了另一个困惑。这是代码 -x = 5y = 3class 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 3Out 5 3In 1 2 1 2现在,我的概念是 python 解释器开始读取和执行从第一行到最后一行的代码。它仅在“调用”时执行类中的代码,而不是在定义时执行。因此,输出应首先打印“Out”。但在这里它首先打印“中间”。这不应该发生,因为 python 解释器在第一次遇到“中间”时 - 它在定义内,因此不应该在那个时候执行。它应该仅在读取调用“Exp”类的最后一行代码后执行。我在 Google 和 StackOverflow 上搜索了解决方案,但找不到为课程解释它的解决方案。请帮助我理解我在哪里弄错了......
查看完整描述

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


查看完整回答
反对 回复 2022-01-18
?
慕的地6264312

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


查看完整回答
反对 回复 2022-01-18
?
慕码人2483693

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)


查看完整回答
反对 回复 2022-01-18
  • 3 回答
  • 0 关注
  • 459 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号