gpt4 book ai didi

python - 在python中,为什么只有在调用另一个模块的方法时才执行类主体中的代码?

转载 作者:太空宇宙 更新时间:2023-11-03 12:59:57 24 4
gpt4 key购买 nike

与 Java 不同,在 Python 中,当一个模块被导入到另一个模块并调用模块的方法时,为什么会执行主体中的代码而不是只执行方法中的代码?

示例(取自另一个 SO 问题):

文件一个.py

def func():
print("func() in one.py")

print("top-level in one.py")

if __name__ == "__main__":
print("one.py is being run directly")
else:
print("one.py is being imported into another module")

文件二.py

import one

print("top-level in two.py")
one.func()

if __name__ == "__main__":
print("two.py is being run directly")
else:
print("two.py is being imported into another module")

当我运行这个时:

python two.py

我得到:

top-level in one.py
one.py is being imported into another module
top-level in two.py
func() in one.py
two.py is being run directly

如果我只想执行 one.pyfunc() 方法,这就是为什么我选择导入然后调用它,我应该做什么?为什么它首先被执行?我知道它在导入时被调用,因为语句 import one。寻找是什么促使 Python 设计者采用这种方式!

最佳答案

编程语言可以有几种不同类型的句法元素。例如,大多数语言都有不同的语句和表达式。一些语言,如 Java,在顶层有其他语法元素。例如,您不能在顶层或类中编写一些语句,但如果您想将类定义放在顶层或类中的方法,那会很好。

您或许可以将 Java 视为在顶层有一个声明性部分,一旦您深入了解它就会切换为命令式(语句),然后可能会在您进一步深入时切换为一个表达式。但是 Python 并不是那样工作的。 Python 确实区分了表达式和语句,但它并没有真正的顶级声明性语法元素。也许您正在考虑这个:

def greet(name):
print("Hello, {}!".format(name))

...与您在 Java 中的方式相同,因为它只能出现在特定的上下文中。但不是:在 Python 中,函数定义是语句,类定义也是,赋值也是。

由于这种设计,“仅导入定义”是不可行的:为了创建定义,必须运行创建定义的代码。

我建议您考虑以下案例。在 Python 中,如果你想创建一个枚举(没有花哨的新 enum 模块),你可以这样做:

FOO, BAR, BAZ = range(3)

对于人眼来说,这可能是我们在导入模块时希望存在的定义。但是,这与您可能希望存在于 __main__ 中的类似内容有何根本区别?

name = input("What's your name? ")

确实没有区别,所以 Python 不会尝试区分它们;当您导入一个模块时,代码就会被执行。


奖励:Java 中的类似行为

想想这个:

public class Test {
static {
System.out.println("Wait, what? Code is running without being called?");
}

public static void main(String[] args) {
System.out.println("Nothing to see here, move along now...");
}
}

关于python - 在python中,为什么只有在调用另一个模块的方法时才执行类主体中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26001511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com