【问题标题】:Importing classes vs importing definitions python导入类与导入定义 python
【发布时间】:2019-05-03 02:32:18
【问题描述】:

我使用 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 中找不到“类与函数”的明显重复项,可能是因为它非常基础。 Here's one that's not tagged Python, though.
  • 除了上面链接中使用的类的描述之外,您在代码中忘记了一个微小的差异。方法函数接收一个对象实例作为第一个参数,而函数没有。按照惯例,每个 Python 编码员都将其称为 selfdef hello() 方法应该是 def hello(self):
  • 模块只是任何 Python 对象的命名空间。导入机制不关心模块中的内容,它是相同的。
  • 没有真正的区别。但是,如果“print hello”只是在类或 def 之外编写,那么它将在导入时立即执行。有时你想要那个。

标签: python python-3.x


【解决方案1】:

根据Python's documentation on Modules

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

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

基本上,当您导入一个模块时,会创建一个模块对象实例,并分配和实例化这个私有符号表。无论您的模块包含什么,此操作过程都是相同的。

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

【讨论】:

    【解决方案2】:

    两者都没有问题。我建议阅读https://docs.python.org/3/reference/import.html 了解导入系统的工作原理。

    【讨论】:

    • OP 的问题不在于两者是否错误,而在于两者之间是否存在差异。
    【解决方案3】:

    创建仅包含静态方法的类(如下所述)时的实际区别是您不能这样做:

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

    【讨论】:

      【解决方案4】:

      首先我要指出的是,它没有使用既定的 Python 术语。

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

      如果您希望它们相同,但您更喜欢使用类来组织您的功能,我建议使用 @staticmethod 装饰器。

      您的代码将如下所示:

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

      Built-in @staticmethod

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-29
        • 2010-09-16
        • 2012-11-19
        • 2023-03-14
        • 1970-01-01
        相关资源
        最近更新 更多