我一直在使用Python一段时间,有一些东西,我错过了。
当导入一个模块时,如果模块包含一个类,或者只是定义,有什么区别吗?例如,我有下面两个模块:
def hello():
print("hello")
或者
class Hello():
def hello():
print("hello")
我从另一个模块导入它
import module_name
module_name.hello()
或者
import module_name
Hello = module_name.Hello()
Hello.hello()
代码有什么不同吗?
如果一个想做并行执行怎么办?如果我只是导入定义会有什么问题吗?
4条答案
按热度按时间wydwbb8l1#
根据Python's documentation on Modules:
模块是包含Python定义和语句的文件。
每个模块都有自己的专用符号表,模块中定义的所有函数都将其用作全局符号表。
基本上,当你导入一个模块时,一个模块对象示例被创建,这个私有符号表被分配和示例化。不管你的模块包含什么,这个操作过程都是一样的。
然而,我不会说你的两个例子都在做同样的事情,因为当你示例化类对象时,在运行时发生的内存分配在低级别上与你简单地调用函数时发生的内存分配是不同的。这种差异应该是不明显的。但是如果你想了解更多关于低级别内存管理的信息,你可以阅读here。
0yg35tkg2#
这两个都没有问题。我建议阅读https://docs.python.org/3/reference/import.html,了解导入系统是如何工作的。
8iwquhpp3#
创建只包含静态方法的类时(如下所述),实际的区别在于:
这是因为
Hello
不是一个模块。或:
如果您有一个文件module_name/Hello.py,其中包含模块属性
hello
(即您的函数)。另一个问题是,在给定的情况下,你并不真的需要
Hello
类对象或它的示例来使Hello.hello
完全起作用。实际上它是一个静态方法。你浪费资源来创建不必要的对象。这里,具有顶级函数的模块是最好的选择。我经常说Python中的模块是类,你不能示例化它们。
实际上,
hello
函数和Hello
类是模块属性而不是“定义”。IMO,当你谈论语法构造时,“定义”一词更合适。pgx2nnw84#
首先我想指出的是,并没有使用已建立的Python术语。
您在第一个示例中讨论函数
hello
,在第二个示例中讨论类方法Hello.hello()
。如果你希望它们是相同的,但是你更喜欢使用类来组织你的函数,我推荐使用
@staticmethod
装饰器。您的代码将如下所示:
内置@静态方法