Python工程化小结
对如何写一个工业级的Python项目作一个top-down小结。
一、项目结构
顶层结构:

文件夹:
- model可以是项目中的自定义类;
- utils是一些工程工具,比如log,tracker
- log存放记录的日志
py文件:
- run:主文件,项目的顶层逻辑;
- settings:run文件中的常量(用作设置);
二、package(包)
__init__.py作用:
- 当文件夹下有__init__.py时,表示当前文件夹是一个package,其下的多个module统一构成一个整体。
模糊导入:
from Root.Pack1 import *
模糊导入中的*中的模块是由__all__来定义的,__init__.py的另外一个作用就是定义package中的__all__,用来模糊导入,如__init__.py:
__all__ = ["Pack1Class","Pack1Class1"]
或者
__all__ = ['file1','file2'] #package1下有file1.py,file2.py
借助__init__.py可以:将子文件中的类名导入到包名下
例如websocket包:websocket.WebSocketApp,外部在import的时候可以看到所有写在__init__.py文件中的类名

websocket包__init__.py文件内容:

websocket包_app.py中

三、类
如何写callback(回调函数):
- 1.在声明处,将用于挂接外部函数的形参写成带默认参数的形式,比如on_message=None:
def __init__(self, url, header=None,
on_open=None, on_message=None, on_error=None,
on_close=None, on_ping=None, on_pong=None,
on_cont_message=None,
keep_running=True, get_mask_key=None, cookie=None,
subprotocols=None,
on_data=None):
"""
url: websocket url.
header: custom header for websocket handshake.
on_open: callable object which is called at opening websocket.
this function has one argument. The argument is this class object.
on_message: callable object which is called when received data.
on_message has 2 arguments.
...
"""
- 2. 类中需定义调用函数,检测外部函数能否正常使用:
def _callback(self, callback, *args):
if callback:
try:
callback(self, *args)
except Exception as e:
_logging.error("error from callback {}: {}".format(callback, e))
if _logging.isEnabledForDebug():
_, _, tb = sys.exc_info()
traceback.print_tb(tb)
- 3. 调用时,通过定义的_callback来调用外部函数API
self._callback(self.on_message, data)
给self绑定一个新属性:
Python由于是动态语言,可以自由地绑定新属性。但在类的方法中需要用hasattr检查是否已存在,防止多次绑定。
if not hasattr(self, 'flop_strategy'):
self.flop_strategy = FlopStrategy()
Python工程化小结的更多相关文章
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- Python字典小结
字典(dict)结构是Python中常用的数据结构,笔者结合自己的实际使用经验,对字典方面的相关知识做个小结,希望能对读者一些启发~ 创建字典 常见的字典创建方法就是先建立一个空字典,然后逐一 ...
- 第11.27节 Python正则小结:正则静,静则明,明则虚,虚则无为而无不为也
正则表达式的章节到此就结束了,老猿现在觉得对我们这些身具程序猿基因特色的人来说,正则表达式应该是蛮可口的开胃小菜. 在写标题时,本来想写"正则表达式小结",后来想了想,百度了一下, ...
- python学习小结8:I/O
文件I/O是Python中最重要的技术之一,在Python中对文件进行I/O操作是非常简单的. 打印到屏幕上 >>> print "python is really a g ...
- python学习小结7:变量类型
变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...
- python学习小结6:模块
模块:在Python中有一个概念叫做模块(module),简单地说,模块就是一个保存了Python代码的文件. 模块能定义函数,类和变量,模块里也能包含可执行的代码. ...
- python学习小结5:封装、继承、多态
面向对象程序设计中的类有三大特性: 继承,封装,多态 继承:以普通的类为基础建立专门的类对象 封装:对外部世界隐藏对象的工作细节 多态:可对不同类的对象使用同样的操作 在Python中类的继承定义基本 ...
- python学习小结4:类
虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程. 类和对象是面向对象编程的两个主要方面.类:创建一个新类型,而对象是这个类的实例,类使用class关键字创建.类的域和方法被列在一个 ...
- python学习小结3:函数
Python是对接口编程,而不是对数据类型编程.例如我们定义了一个函数,在函数里用到了in这个接口,那么只要传入的参数实现了这个接口就可以,我们不在乎它是list还是tuple. 简单的函数 使用de ...
随机推荐
- .NET本质论 组件
模块定义 CLR程序存在模块(module)中.一个CLR模块是一个字节流,通常作为一个文件存储在本地的文件系统中或者Web服务器上 CLR模块采用Windows NT的PE/COFF可执行文件格式的 ...
- day9大纲
01 作业内容回顾 函数的初识: 封装一个功能. def 函数名(): 函数体 函数的返回值:return 1,结束函数. 2,返回给执行者(函数名())值. return ----> None ...
- 教你用CMD命令查询域名的DNS解析记录:A,NS,MX,CNAME,TXT
1.查询域名的A记录 nslookup -qt=A qqgzs.com 当然查询A记录你直接用ping命令来ping域名也可以获得A记录. 2.查询域名的NS记录 nslookup -qt=NS qq ...
- Block Design 小技巧之添加RTL代码到block_design
Block Design 小技巧之添加RTL代码到block_design 1.首先得打开Block Design,右击RTL文件,才会出现Add module to Block Design选项. ...
- 根据时间段获取时间段内所有时间点(js)
Date.prototype.format=function (){var s='';s+=this.getFullYear()+'-';// 获取年份.s+=(this.getMonth()+1)+ ...
- HelloStruts
Hello Struts 建立项目 打开myeclipse 新建项目 选择myeclipse-java enterprise projects-web project 项目名称:hellostruts ...
- Python开发经验汇总
1.工具 (1)编代码用“JetBrains PyCharm”: (2)要想编写的脚本能够直接双击运行,还需要用pyinstaller打包工具: (3)要下载pyinstaller就用Python自带 ...
- JPanel添加键盘监听事件
因为在自己的游戏需求中谢了要用键盘控制飞机的移动,所以用到键盘监听事件,但是使用了JPanel之后添加了键盘监听事件,按相应的方向键飞机并没有反应.但是如果是为JFrame的内容面板加则会有反应. 为 ...
- 把1,2,3…n*n 的数字按照顺时针螺旋的形式填入数字矩阵
从键盘输入一个整数(1~20)则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中.例如:输入数字2,则程序输出:1 24 3输入数字3,则程序输出:1 2 38 9 47 ...
- Kubernetes1.8以后kubelet连接api-server问题
Kubernetes1.8以后版本,kubelet命令去掉--api-servers选项,参考官方kubelet 1.8 --kubeconfig string Path to a kubeconfi ...