Python:包,模块和类 - 这种方法有用吗?

时间:2016-04-14 03:41:41

标签: python

在这方面阅读了相当数量后,我为自己想出了以下内容。

  • __init__.py包含所有供外部使用的子模块的导入;一个__all__变量,其中包含所有。
  • 的列表
  • 类通常是一个模块,但是如果将一些类捆绑到单个模块中是有意义的,那么这是允许的。
  • 非公开使用的模块未在__init__.py中导入,并且未在其__all__成员中列出。这会阻止但不会阻止用户代码访问这些非公共模块。
  • 任何' runnable'包中的子模块必须显式,非相对地导入任何所需的子模块。
  • 应使用-m运行这些可运行的子模块。例如python3 -m mypackage.mySubModule
  • 任何子模块都可以通过from mypackage import *导入整个模块。允许子模块作者,使用简单方法获取所有(公共)子模块,并公平地信任它们以智能地处理冲突问题,识别子模块的名称等等似乎是公平的。它还会给{ {1}} __init__.py 这是__all__我唯一能够容忍:}

我能想到的最大缺点是......

  • 仍可访问非公共子模块。
  • 子模块显式使用包名称,因此如果包名称发生更改,则模块会中断
  • 我只允许from foo import *这一次,这就是着名的最后一句话'因为它得到了。

我也很高兴听到其他问题。

以下是一个简化但完整的示例。非常感谢所有人。

文件&目录布局

from foo import *

__初始化__。PY

mypackage/
    __init__.py
    A.py           # class A
    B.py           # class B
    _Helper.py     # Helper class used by A and B
    api.py         # public API for mypackage
    runMe.py       # A runnable class inside mypackage (possibly for testing)

userCode.py     # Code that uses mypackage; could be located anywhere

A.py(和B.py一样)

from mypackage.A import A
from mypackage.B import B
from mypackage import api
__all__ = ['A', 'B', 'api']

_Helper.py

from mypackage import _Helper

class A:
    def __init__ (self): pass
    def test (self):     _Helper.printMessage()

api.py

def printMessage ():
    print("*** _Helper.printMessage() is reachable ***")

runMe.py

from mypackage import *

def createA (): return A()
def createB (): return B()

userCode.py     导入mypackage

from mypackage import api

a = api.createA()
a.test()

b = api.createB()
b.test()

0 个答案:

没有答案