Python 名称空间和类

Python 名称空间和类,python,class,module,scope,Python,Class,Module,Scope,我正在尝试用Python编写一些(我认为)可读的代码。我需要一个模块,将包含一些类。理论上,我知道实现这一点所需的一切:我可以简单地将类定义放在单个模块文件中 为了便于阅读,我想将每个类定义放在单独的文件中(它们开始变得相当长!),并将所有这些类放在一个目录中。每当我创建新文件时,尽管它的内容在我需要它们的地方是可见的,但其中的类定义的范围是不需要的模块 我该怎么做?“Python”是如何做到这一点的?将它们全部导入\uuu init\uuu.py中,然后让使用者导入包 from .module

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

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


我该怎么做?“Python”是如何做到这一点的?

将它们全部导入
\uuu init\uuu.py
中,然后让使用者导入包

from .module1 import Class1
from .module2 import Class2
 ...

如果要避免在许多地方硬编码模块路径、文件、类和函数名,可以执行如下操作,动态导入(几乎)在包的子目录中找到的所有Python文件

关键是要记住,
\uuu init\uuuu.py
文件本身是一个基本上不受约束的Python脚本,因此可以自由地执行相当复杂的处理来确定包的名称空间中有什么

文件
包\\uuuu init\uuuuu.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()
class Class1(object):
    pass
class Class2(object):
    pass
class Class3(object):
    pass
import package

print(package.Class1)
print(package.Class2)
print(package.Class3)
文件
package\Class1.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()
class Class1(object):
    pass
class Class2(object):
    pass
class Class3(object):
    pass
import package

print(package.Class1)
print(package.Class2)
print(package.Class3)
文件
package\Class2.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()
class Class1(object):
    pass
class Class2(object):
    pass
class Class3(object):
    pass
import package

print(package.Class1)
print(package.Class2)
print(package.Class3)
文件
package\Class3.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()
class Class1(object):
    pass
class Class2(object):
    pass
class Class3(object):
    pass
import package

print(package.Class1)
print(package.Class2)
print(package.Class3)
文件
usepackage.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()
class Class1(object):
    pass
class Class2(object):
    pass
class Class3(object):
    pass
import package

print(package.Class1)
print(package.Class2)
print(package.Class3)
运行
usepackage.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()
class Class1(object):
    pass
class Class2(object):
    pass
class Class3(object):
    pass
import package

print(package.Class1)
print(package.Class2)
print(package.Class3)


前面的点是什么意思?遗憾的是,我仅限于Python 2.4,因为脚本将在第三方嵌入式设备上运行。这个点符号在旧版本中似乎不起作用。我用这些子模块的完整路径替换了它。这太棒了。适用于python 3.4.1。