我使用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()
代码是否有区别?
如果要进行并行执行怎么办?如果我仅导入定义,会有任何问题吗?
答案 0 :(得分:2)
根据Python's documentation on Modules:
模块是一个包含Python定义和语句的文件。(...)
每个模块都有自己的专用符号表,该模块中定义的所有功能都将其用作全局符号表。
基本上,在导入模块时,将创建模块对象实例,并分配和实例化此专用符号表。无论模块包含什么内容,此过程都是相同的。
但是,我不会说两个示例都在做相同的事情,因为在实例化类对象时在运行时发生的内存分配在较低程度上与仅调用函数时发生的情况不同。 。这种差异不应该引起注意。但是,如果您想进一步了解低级内存管理,可以阅读here。
答案 1 :(得分:0)
它们中的任何一个都没有错。我建议阅读https://docs.python.org/3/reference/import.html有关导入系统如何工作的信息。
答案 2 :(得分:0)
创建仅包含静态方法的类(下面说明)时,实际的区别是您不能做:
from module_name.Hello import hello
这是因为Hello
不是一个模块。另一方面,您可以:
from module_name import hello
或:
from module_name.Hello import hello
如果您有一个文件 module_name / Hello.py ,其中包含模块属性hello
(即您的函数)。
另一个问题是,在给定的情况下,Hello
并不需要Hello.hello
类对象或其实例才能完全起作用。实际上,这是一种静态方法。您浪费资源来创建不必要的对象。具有顶级功能的模块是这里的最佳选择。
我经常说Python中的模块是您无法实例化的类。所有事物都被认为是Singletons。
实际上,hello
函数和Hello
类也是模块属性而不是“定义”。 IMO,当您谈论语法构造时,“ definitions”一词更合适。
答案 3 :(得分:0)
首先,我想指出的是,它没有使用既定的Python术语。
您要在第一个示例中讨论函数hello
,在第二个示例中讨论类方法Hello.hello()
。
如果希望它们相同,但是您更喜欢使用类来组织函数,我建议使用@staticmethod
装饰器。
您的代码将如下所示:
class Hello():
@staticmethod
def hello():
print("hello")