导入类与导入定义python

问题描述 投票:4回答:4

我已经使用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()

代码有什么不同吗?

如果想要并行执行怎么办?如果我只是导入定义,我会有任何问题吗?

python python-3.x
4个回答
2
投票

Python's documentation on Modules说:

模块是包含Python定义和语句的文件。(...)

每个模块都有自己的私有符号表,该表用作模块中定义的所有函数的全局符号表。

基本上,在导入模块时,会创建模块对象实例,并分配和实例化此私有符号表。这个过程与您的模块包含的内容无关。

但是,我不会说你的两个例子都在做同样的事情,因为在你实例化你的类对象时在运行时发生的内存分配将比你简单地调用你的函数时的低级别不同。这种差异不应该是显而易见的。但是如果你想了解更多有关低级内存管理的信息,你可以阅读here


0
投票

它们中的任何一个都没有错。我建议阅读https://docs.python.org/3/reference/import.html关于导入系统如何工作。


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,当你谈论语法结构时,“定义”这个词更合适。


0
投票

首先,我想指出不使用已建立的Python术语。

您在第一个示例中讨论函数hello,在第二个示例中讨论类方法Hello.hello()

如果你想要它们是相同的,但你更喜欢使用类来组织你的函数我建议使用@staticmethod装饰器。

您的代码将如下所示:

class Hello():
    @staticmethod       
    def hello():
        print("hello")

Built-in @staticmethod

© www.soinside.com 2019 - 2024. All rights reserved.