导入类与导入定义python

0wi1tuuw  于 2022-11-28  发布在  Python
关注(0)|答案(4)|浏览(133)

我一直在使用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()

代码有什么不同吗?
如果一个想做并行执行怎么办?如果我只是导入定义会有什么问题吗?

wydwbb8l

wydwbb8l1#

根据Python's documentation on Modules
模块是包含Python定义和语句的文件。
每个模块都有自己的专用符号表,模块中定义的所有函数都将其用作全局符号表。
基本上,当你导入一个模块时,一个模块对象示例被创建,这个私有符号表被分配和示例化。不管你的模块包含什么,这个操作过程都是一样的。
然而,我不会说你的两个例子都在做同样的事情,因为当你示例化类对象时,在运行时发生的内存分配在低级别上与你简单地调用函数时发生的内存分配是不同的。这种差异应该是不明显的。但是如果你想了解更多关于低级别内存管理的信息,你可以阅读here

0yg35tkg

0yg35tkg2#

这两个都没有问题。我建议阅读https://docs.python.org/3/reference/import.html,了解导入系统是如何工作的。

8iwquhpp

8iwquhpp3#

创建只包含静态方法的类时(如下所述),实际的区别在于:

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中的模块是类,你不能示例化它们。
实际上,hello函数和Hello类是模块属性而不是“定义”。IMO,当你谈论语法构造时,“定义”一词更合适。

pgx2nnw8

pgx2nnw84#

首先我想指出的是,并没有使用已建立的Python术语。
您在第一个示例中讨论函数hello,在第二个示例中讨论类方法Hello.hello()
如果你希望它们是相同的,但是你更喜欢使用类来组织你的函数,我推荐使用@staticmethod装饰器。
您的代码将如下所示:

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

内置@静态方法

相关问题