Python包、模块、类和代码文件目录的管理方案

1.要解决的问题

Python在语义中存在着包、模块、类(当然还有函数)这几个概念。

在编写Python代码时,我们需要管理代码的文件目录结构

这时候会遇到这样一种情况:

1.由于Python一个文件算一个模块,一个带__init__.py的目录算一个包

2.而为了控制代码文件不要过大,我们需要的是一个类(几个类或加些许函数)分配一个文件

3.这时候会出现类似这样的语句:

#第一种

importpackage_a.class_a_fileascaf

a=caf.ClassA()

#第二种

formpackage_a.class_a_file import *

a=ClassA()

#另外几种就不意义列举了...

以上除了直观上可以看出import过长外,隐藏的另一点是我们是希望一个类用一个文件,在使用多个相关类的时候就必须写很多import。(注:我们可不想一堆代码扎堆,弄出一个超大代码文件。)

2.解决方案要达到的效果

#文件目录结构

#|--demo.py

#|--package_a

#   |--__init__.py

#   |--class_a.py  #类ClassA

#   |--class_b.py  #类ClassB和函数func_b()

#demo.py中可以直接使用

from package_a import *

a=ClassA()

b=ClassB()

func_b()

由于Python里一个带__init__.py的目录算一个包,所以利用这一机制,把类文件放在包里,用包来管理类。

注:在Python里“包是模块,而模块不是包”。用system.modules可以取到的名字是包和模块都有的,而用__package__却能很好的区分包和模块。也就是“包其实是一种特殊的模块”。

3.解决方案

这就是解决方案的文件base.py,代码很短:

import sys

_packet_={}

#它是个装饰器,item是类,或者函数

def export(item):

#获取item的模块对象

module=sys.modules[item.__module__]

#由模块对象得到包对象

package=sys.modules[module.__package__]

#把item添加到包的__dict__里

package.__dict__[item.__name__]=item

#生成所有使用该解决方案的包的__all__变量,并把导出的item添加进去

ifnotpackage.__name__in_packet_:

_packet_[package.__name__]=[]

_packet_[package.__name__].append(item.__name__)

#原封不动地把item返回

returnitem

#它是个函数,在包__init__.py里用于获取__all__

def packet(name):

ifnotnamein_packet_:

_packet_[name]=[]

return_packet_[name]

代码用意我写在注释里了,就是以装饰器来把类添加到包的__dict__和__all__里。__all__需要利用packet在包里生成,不这么做只会使得from package_name import * 后不能找到类,需要写具体的类名from package_name import ClassA。

4.使用解决方案

先来看下使用解决方案后的目录结构:

#文件目录结构(使用后结构只多了base.py)

#|--base.py

#|--demo.py

#|--package_a

#   |--__init__.py

#   |--class_a.py  #类ClassA

#   |--class_b.py  #类ClassB和函数func_b()

代码处就需要做到以下几点:

1.关于被导出的类文件里应该怎么做,这里以class_b.py为例子:

# ./package_a/class_b.py

#1.需要导入base

importbase

#2.使用export装饰器,装饰要导出的类或函数

@base.export

classClassB:pass

#2.同样的export可以导出函数

@base.export

def func_b():

print('func_b')

2.使用了导出功能的包要做什么,这里以package_a包为例:

# ./package_a/__init__.py

#1.导入base

importbase

#2.导入将要导出的子模块,需要具体模块名字的形式,from . import * 不可用

from.importclass_a,class_b

#3.用packet初始化__all__,这个可选,主要是看要不要支持 from 的用 * 导入

__all__=base.packet(__name__)

#4.这个是可选的,因为如果用了__all__会影响from *。可以用export把__init__.py里的项,加入__all__

@base.export

def pafunc():

print('pafunc')

5.总结

使用该解决方案可以归纳为两点:

1.用@base.export标记要导出的类或函数

2.在包__init__.py里初始化__all__ = base.packet(__name__)

3.(说好的只有两点呢?)其实第2点是可选的,不过最好加上。而在包的__init__.py里导入子模块才是真正的第2点。不然子模块不会被载入,也谈不上导出了。

最后,demo.py里可以这么写,和预期的效果一样:)

# ./demo.py

from package_a import *

a=ClassA()# 上面的实例没有给出,不过假设有ClassA在class_a.py里的

b=ClassB()

func_b()学好python你需要一个良好的环境,一个优质的开发交流群,群里都是那种相互帮助的人才是可以的,我有建立一个python学习交流群,在群里我们相互帮助,相互关心,相互分享内容,这样出问题帮助你的人就比较多,群号是304加上050最後799,这样就可以找到大神聚合的群,如果你只愿意别人帮助你,不愿意分享或者帮助别人,那就请不要加了,你把你会的告诉别人这是一种分享。无论是学习任何一门语言,基础知识,就是基础功非常的重要,找一个有丰富编程经验的老师或者师兄带着你会少走很多弯路, 你的进步速度也会快很多,无论我们学习的目的是什么,不得不说Python真的是一门值得你付出时间去学习的优秀编程

语言。

感觉写的好,对你有帮助,就点个赞呗,别光只收藏哈.~( ̄▽ ̄)~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 类 类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。 模块 模块,在Python可理...
    随风化作雨阅读 1,894评论 0 5
  • Python类、模块、包的区别 类类的概念在许多语言中出现,很容易理解。它将数据和操作进行封装,以便将来的复用。模...
    周倜吉阅读 5,253评论 0 3
  • 朋友的孩子是个非常优秀的女生,从小到大,年级第一名是她的标榜,各类比赛也是屡屡得奖,就连大学,研究生都是保送,长的...
    榕莎莎阅读 511评论 0 1
  • 单曲循环了三天的歌 今天终于去看了电影 有点浮夸 可是感情很细腻 很细微 很纯真 很好看 还有 今天下了初...
    MaoMaoMei阅读 311评论 5 0
  • 这是一本很短的戏剧剧本,大概讲述了一个出轨流言的故事。 胡立安收养埃内斯托为养子,却传出埃内斯托与其养母,也就是自...
    随风铭记阅读 1,963评论 0 1