在编写Python代码的过程当中,为了更好的管理代码,咱们会使用到包(package)、模块(module)、类(class)、函数(function)。
介绍一下这几个概念:python
而后再来看看咱们平常使用包、模块和类的作法app
# 目录结构 #|--demo.py #|--package_a # |--__init__.py # |--class_a.py 类ClassA # |--class_b.py 类ClassB # ./demo.py # 导入方式一 from package_a.class_a import ClassA from package_a.class_a import ClassB a = ClassA() b = ClassB() # 导入方式二 import package_a.class_a as ca import package_a.class_b as cb a = ca.ClassA() b = cb.ClassB()
好的,咱们的问题来了,怎么样才能减小咱们导入部分的代码呢?或者说怎么样才能使得一些相关联的模块不须要一个一个的进行导入呢?最终实现到下面的样子是否是会更好函数
# ./demo.py from package_a import * a = ClassA() b = ClassB()
# ./common.py import sys _packet_ = {} # 装饰器,func是类或者函数 def export(func): module = sys.modules[func.__module__] # 获取func的模块对象 package = sys.modules[module.__package__] # 由模块对象获得包对象 package.__dict__[func.__name__] = func # 把func添加到包的__dict__里 # 生成全部使用该解决方案的包的__all__变量,并把导出的func添加进去 if not package.__name__ in _packet_: _packet_[package.__name__] = [] _packet_[package.__name__].append(func.__name__) # 原封不动地把func返回 return func # 在包的__init__.py里用于获取__all__ def packet(name): if not name in _packet_: _packet_[name] = [] return _packet_[name]
# 目录结构 #|--common.py(就是上面的装饰器文件) #|--demo.py #|--package_a # |--__init__.py # |--class_a.py 类ClassA # |--class_b.py 类ClassB
首先在模块中处理咱们建立的类code
# ./package_a/class_a.py import common # 使用export装饰器,装饰要导出的类或函数 @common.export class ClassB(object): def __init__(self): print 'This is ClassB.'
而后在包的__init__.py中修改包自身对象
# ./package_a/__init__.py import common # 注意,这步很重要!!!导入将要导出的子模块,须要具体模块名字,此处import * 不可用 from . import class_a, class_b # 用packet初始化包的__all__,主要是用于支持 "from . import *" 导入 __all__ = common.packet(__name__) # 由于用__all__会影响"from . import *"。因此用export把__init__.py里的成员,加入__all__ @common.export def pafunc(): """ 这是一个包内部的函数 """ print('pafunc')
最终就能够实现咱们前面所指望的导入方式了。it
# ./demo.py from package_a import * a = ClassA()