【问题标题】:Multiple classes in a Python modulePython 模块中的多个类
【发布时间】:2011-02-07 17:30:17
【问题描述】:

我对 Python 非常陌生(我来自 JAVA 背景),我想知道是否有人可以帮助我了解一些 Python 标准。在一个模块中放置多个类是正常的还是“正确的”做法?我一直在使用 Django 并从教程开始,他们将数据库模型类放在同一个模块中。这是通常做的事情还是我应该坚持每个模块 1 类?有没有理由我会做一个而不是另一个?

希望我是清楚的,而不是笼统的。提前感谢大家!

【问题讨论】:

标签: python


【解决方案1】:

以下是我从典型 Java 项目中看到的一个有用的经验法则:

Java 中最底层的包应该是 Python 中的文件

这是什么意思? 如果您的 Java 项目是有组织的:

toplevel/
   subproject/
        Foo.java
        Bar.java
   subproject2/
        Baz.java
        Qux.java

那么你的 Python 项目应该如下所示:

toplevel/
    subproject.py <-- put class Foo, Bar here
    subproject2.py <-- put class Baz, Qux here

注意事项:组织:

  • 不要使用内部类。就放 同一模块中的类
  • 按照惯例,以 _ 开头的内容是“私有的”
  • 可以有“公共变量”

【讨论】:

  • 来自 python 之外的我真的很难将多个类放在同一个文件中,或者文件名与类不同。
  • 这似乎也有效,来自 subproject.Foo import *。我们为什么不这样做,然后每个文件有一个类,一个模块中有许多类,有什么原因吗?写起来有点烦人,你不能一次导入所有的类。有没有办法使用 __init__.py 和 __all__ 导入模块中的所有类(不必将类用作 Foo.Foo())?
【解决方案2】:

这样想。

在java中你写的是一个类,而在Python的情况下你写的是一个模块而不是一个类。所以一个模块可以包含几个类。 每当您想使用特定的类时,请先导入相应的模块,然后调用该类来制作对象。

这是一个例子。

Classes.py(这是一个名为“Classes”的模块)


class MyClass(object):  


    def greet(self):
        print("Hello World")


class MyNextClass(object):

    def greetAgain(self):
        print("Hello again")

现在我可以从任何我希望的地方导入这个模块


import Classes

if __name__ == '__main__':

    a=Classes.MyClass()
    a.greet()

    b=Classes.MyNextClass()
    b.greetAgain()

【讨论】:

    【解决方案3】:

    如有疑问,请查看 Python 的标准库 :)

    例如,标准日历模块包含 31 个类。所以是的,没关系。

    【讨论】:

      【解决方案4】:

      这样做是绝对正确的。模块将相关功能分组。如果该功能在多个类(例如 Tree、Node、Leaf)中实现,那么将它们放在一起是合适的。

      与 Java 类相比,模块与 Java 包的关联更紧密。您还可以将模块实现为以模块命名的文件夹,其中包含 __init__.py 文件(因此 Python 可以识别模块;__init__.py 还可以选择包含初始化代码和类、函数和函数的列表)要导出的子包。)

      【讨论】:

      • 注意,大多数样式标准都将__init__.py 设为空或接近空。事实证明,在同一级别包含子模块和普通内容的模块可能会让人感到困惑和杂乱无章。
      • @Mike Graham:django 在__init__.py 文件中放置了很多函数和类,django 似乎很受好评。
      • @blokeley,Django 确实很受欢迎,但我不知道它是否被广泛认为是遵循 Python 的最佳原则。我自己从未使用过 Django,但听起来它需要人们记录一些丑陋、可怕的事情才能让他们的应用程序正常工作。请参阅 jcalderone.livejournal.com/39794.htmleffbot.org/pyfaq/what-is-init-py-used-for.htm 以及各种 SO 线程以了解 __init__.py 通常是空的。我的站点包中执行此操作的项目包括 Twisted、PyMeta 和 PyFlakes。
      【解决方案5】:

      这在 Python 中当然是很正常的事情。何时以及为何选择其中一个,部分是品味问题,部分是惯例问题。

      如果您仍在了解 Python 及其约定,阅读the style guide 非常值得您花时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-20
        • 2018-08-31
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多