匹配包/模块名称的存储类定义的 Pythonic 位置?

2024-10-02 02:27:28 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个ruby类中定义它的一个常规名称。嵌套可以通过创建与文件同名的文件夹来完成。在

+--lib
   +--broccoli.rb
   +--broccoli/
      +--broccoli_powers.rb
      +--broccoli_powers/
        +--green.rb

我对python比较陌生,所以我正试图找出如何在python中生成等价的结构(但我希望它是“pythonic”)。事物不能像ruby那样结构化的主要原因是不能有一个同名的模块和包:

这行不通——没办法西兰花.py还有花椰菜:

^{pr2}$

解决此问题的一种方法是在文件夹的\uu init_uu.py中定义一个同名类:

+--lib
   +--broccoli/
      +--__init__.py  # <- define "class Broccoli" here
      +--broccoli_powers.py

现在,我可以像这样使用花椰菜类:

from broccoli import Broccoli

我可以在花椰菜课上这样:

from broccoli.broccoli_powers import BroccoliPowers

但是如果我想深入到花椰菜的名称空间,那么我需要移动花椰菜_电源.py放入花椰菜powers文件夹的\uu init_u.py中,如下所示:

+--lib
   +--broccoli/
      +--__init__.py   # <- class Broccoli
      +--broccoli_powers/
          +--__init__.py   # <- class BroccoliPowers
          +--green.py

这并不像看上去那么糟糕,因为BroccoliPowers类仍然可以通过与之前完全相同的调用访问:“from”西兰花进口花椰菜”。在

我不喜欢把大量的代码塞进u init_uuy.py文件中,但我很自然地将代码组织到类中,嵌套类似乎也很自然。“Python”的方法是什么?在

当我想嵌套时,我考虑过的另一种方法是将类定义移动到某个文件中(例如“时钟.py“或”克拉斯.py”)并将其导入到UuInit_U.py文件命名空间中,如下所示:

+--lib
   +--broccoli/
      +--__init__.py  # <- "from cls import Broccoli" 
      +--cls.py       # <- define "class Broccoli" here
      +--broccoli_powers.py

这样可以达到同样的效果(我可以像预期的那样访问Broccoli类:“from Broccoli import Broccoli”),而且我没有在uinit_uu.py文件中放入大量代码。在

Python的筑巢方式是什么?我错过了什么?在


Tags: 文件frompyimport文件夹定义initlib
1条回答
网友
1楼 · 发布于 2024-10-02 02:27:28

首先,您应该考虑到类在Python中的需求要比在Ruby中少得多。所有代码都需要在一个类中;您应该为需要封装状态的时候保留这些代码。独立的函数可以在模块级完美地生存。在

另一件要记住的事情是Python的Zen的一个元素(如果您没有看到的话,请在shell中做import this):平面比嵌套好。也就是说,深度嵌套代码并不常见,您可能需要重新考虑您的结构。在

现在,考虑到这两个因素,我想说您的最后一个选择是最具python风格的:在单独的模块中定义您的类,并将其导入__init__.py。在

相关问题 更多 >

    热门问题