【问题标题】:Why is the code inside these class definitions being executed?为什么要执行这些类定义中的代码?
【发布时间】:2019-12-28 18:47:44
【问题描述】:

this answer 中据说

所有处于缩进级别 0 的代码都会被执行。 定义的函数和类已经定义好了,但没有 他们的代码开始运行。

但是,如果我有以下foo.py

print("Line 1")


class HelloWorld:
    print(__name__)
    if True:
        print("Hello, World!")


class Hello2:
    print(__name__)
    print("Hello 2")


def functionA():
    print("Running code in function")

我希望只打印“第 1 行”,但是当我运行它时,我得到了

Line 1
__main__
Hello, World!
__main__
Hello 2

为什么要执行类中的代码?

【问题讨论】:

  • 因为代码是他们定义的一部分,它不在方法内。

标签: python class main


【解决方案1】:

因为python在执行文件时需要“构建”类,而那部分代码就是“构建”过程的一部分。

该类仅在程序的生命周期内构建一次。 例如,如果您在脚本末尾添加

instanceOne = HelloWorld()
instanceTwo = Hello2()

您会看到没有任何打印语句将再次执行。

【讨论】:

    【解决方案2】:

    您引用的另一个答案是正确的,但“缩进 0 处的所有代码都已执行”并不意味着“其他缩进级别的代码均未执行”。在这种情况下,处理 class 语句(缩进为 0)需要执行它们包含的缩进代码。

    很明显,这行代码已经执行,并且符合你的预期:

    print("Line 1")
    

    最后这个块被执行,定义了一个函数。该函数永远不会被调用,所以这个打印语句实际上并没有被执行

    def functionA():
        print("Running code in function")
    

    这两个类定义也被执行。执行类定义会创建一个类对象。为了初始化该类对象,执行类定义中的代码。大多数情况下,这将由def 语句组成,用于在类中定义函数。就像独立的def 示例一样,将执行def 语句,创建一个函数对象,但不会调用该函数。

    在您的情况下,您在类定义中的代码除了定义函数之外还执行其他操作。这允许您拥有为类对象设置初始状态的代码。这些是在处理class 语句的过程中执行的,因此您会在此时看到它们的副作用。

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 2011-12-18
      • 2020-04-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      相关资源
      最近更新 更多