python 类命名空间,关于python:命名空间和类

我正在尝试用Python编写一些(在我看来)可读的代码。我需要一个包含许多类的模块。理论上,我知道实现这一点所需的一切:我可以简单地将类定义放在一个模块文件中。

为了便于阅读,我想将每个类定义放在单独的文件中(它们开始变得很长!)将所有这些类放到一个目录中。每当我创建新文件时,尽管它的内容在我需要它们的地方是可见的,但是在其中的类定义的作用域是不需要的模块。

我该怎么做?"python"是怎么做到的?

在__init__.py中全部导入,然后让消费者导入包。

from .module1 import Class1

from .module2 import Class2

...

前面的点是什么意思?

@samuil:python.org/dev/peps/pep-0328

遗憾的是,我只能使用Python2.4,因为脚本将在第三方嵌入式设备上运行。这个点符号在旧版本中似乎不起作用。我已经用这些子模块的完整路径替换了它。

如果希望避免在许多地方对完整路径、文件、类和函数名进行硬编码,可以执行如下操作:动态导入(几乎)它在包的子目录中找到的所有python文件。

关键是要记住,__init__.py文件本身是一个很大程度上不受约束的python脚本,因此可以自由地执行相当复杂的处理,以确定包的名称空间中有什么。

文件package\__init__.py:

def _import_package_files():

""" Dynamically import all the Python modules in this module's sub directory."""

import os

import sys

import traceback

package_path = os.path.split(__file__)[0]

package_directory = os.path.split(package_path)[1]

for fn in os.listdir(package_directory):

globals_, locals_ = globals(), locals()

# process all python files in directory that don't start with underscore

if fn[0] != '_' and fn.split('.')[-1] in ('py', 'pyw'):

modulename = fn.split('.')[0] # filename without extension

subpackage =".".join([package_directory, modulename])

try:

module = __import__(subpackage, globals_, locals_, [modulename])

except:

traceback.print_exc(file=sys.stdout)

raise # reraise exception

_import_package_files()

文件package\Class1.py:

class Class1(object):

pass

文件package\Class2.py:

class Class2(object):

pass

文件package\Class3.py:

class Class3(object):

pass

文件usepackage.py:

import package

print(package.Class1)

print(package.Class2)

print(package.Class3)

运行usepackage.py的输出:

这太棒了。在python 3.4.1中工作。