一、包管理

1、为什么使用包管理

目的是为了便于共享。为了更多项目调用使用,或者共享给别人,就需要打包,目的是为了复用。

Pypi(Python Package Index)公共的模块存储中心。https://pypi.python.org/pypi

2、主要工具

(1)distutils 官方标准库,使用安装脚本setup.py来构建、安装包。

(2)setuptools 是替代distutils的增强版工具集,包含easy_install工具,使用ez_setup.py文件,支持egg格式的构建和安装。

提供查询,下载,安装,构建,发布,管理等包管理功能。

(3)Pip

Pip是目前包管理的事实标准。

构建在setuptools之上,替代easy_insall的,同样提供丰富的包管理功能。

(4)wheel

提供bdist_wheel作为setuptools的扩展命令,这个命令可以用来生成新打包格式wheel,

Pip开始提供了一个wheel子命令来安装wheel包,必须先安装wheel模块,让Python库以二进制形式安装,不需要再本地编译。

3、使用setup.py打包

首先创建一个setup.py文件,

内容:

from distutils.core import setupsetup(name='3',version='0.1.1',description = 'test',author='wcl',author_email='www.qq.com',packages = ['3']
)#name:名字
# version 版本
# packages=[]打包列表
# packages = ['3']指定以后,就会把所有的非目录子模块打包。
# ['m','m.m1.m2.m3'] 逐级建立目录,但是只是把m的所有非目录子模块打包。后面的也打包
#description 描述信息
#author 作者
#author_email作者邮件
#url 包的主页,可以不写

查询帮助命令:Python setup.py cmd -help

4、build命令、编译

创建一个build目录

#Python setup.py build

在项目目录下多了build目录,有一个lib子目录,lib下就是模块m的目录。

所有的.py 文件全部被复制了,但是子目录没有被复制。

构建了同样的目录结构,并只是拷贝了__ init __ .py 文件。

build 得到的文件,直接拷贝到其他项目就可以使用了。

打包的时候子包不要,模块还是要带上的。 setup.build。Packages后面写的是包名,而不是模块名。

5、install命令,安装

Build后就可以install,直接运行

###Python setup.py install

创建源代码的分发包

产生一个dist目录,里面生成一个带版本号的压缩包。

在其他地方解压缩文件,里面有setup.py 就可以直接使用 Python setup.py install 安装了,也可以 ##pip install xxxxxxxxxxx 直接使用pip安装这个压缩包。

制作window是下的分发包:Python setup.py bdist_wininst.

打包成rpm:Python setup.Py bdist_rpm

也可以将写好的模块发布到公共的pipy上,也可以搭建pypi私服。

模块名前后:优先级。

7、wheel包

安装wheel依赖

## pip install wheel
from distutils.core import setup
from setuptools import setup
setup(name='3',version='0.1.1',description = 'test',author='wcl',author_email='www.qq.com',packages = ['3']
)

分发一下,元代码打包成zip包。

二、插件化开发
动态导入

运行时候,根据用户需求(提供字符串),找到模块的资源动态加载起来。

1、__ import __()内建函数

__import__ (name,globals=None,locals = None,fromlist=(),level=0)

Name模块名

Import语句本质上就是调用这个函数,但是不鼓励其直接使用,使用importlib.import_module().

Sys = _import__(‘sys’)

M2模块:

class A:

def show(self):print('A')

M1:模块

if __name__ == '__main__':mod = __import__('m2')cls = getattr(mod,'A')cls().show()

动态的调用

2、importlib.import_module()

class A:

  def show(self):print('A') import importlib
def load(name:str,sep='.'):m,_,c = name.partition(sep)mod = importlib.import_module(m)cls = getattr(mod,c)return cls()if __name__ == '__main__':a = load('m2.A')a.show()A

插件化的核心代码。

3、插件化编程技术

依赖的技术

反射:运行时候获取类型的信息,可以动态维护类型数据。

动态import:推荐使用importlib模块,实现动态import模块的能力。

多线程:可以开启一个线程。等待用户输入,从而加载指定名称的模块。

4、加载的时机

1)程序启动时候。启动时候扫描固定的目录,加载插件。

2)程序运行时。程序运行中,接受用户指令或请求,启动相应的插件。

两个方式各有利弊,如果插件过多,会导致程序启动很慢,如果用户使用时候在加载,如果插件太大或者依赖多,插件将会启动慢。

所以先加载常用的,必须的插件,其他插件使用时候,发现需要,动态载入。

5、应用

软件的设计不可能尽善尽美,或者在某些功能上,不可能做的太专业了,需要专业的客户自己增强。

接口和插件的区别:

接口往往是暴露出来的功能。例如模块提供的函数或方法,加载模块后调用这些函数完成功能。接口也是一种规范,约定了必须实现的功能(必须提供某名称的函数),但是不关心怎么实现这个功能。

插件是吧模块加载到系统中,运行它,增强当前系统功能,或者提供系统不具备的功能,

往往插件技术应用在框架设计中,系统本身设计简单化,轻量级,实现基本功能后,其他功能通过插件加入进来,方便扩展。

三、基础知识补充的

1、__ slots __

问题的引出

字典为了提升查询效率,必须利用空间换时间。

一般来说一个对象,属性多一点,都存储在字典中便于查询,问题不大。

对象数百万个。字典占用率就有些大了。

只要slots定义的,就会阻止了实例的字典,没有了字典,里面只能出现定义的属性,没有定义的一律不能使用。

class A:

   X = 1__slots__ = ('x','y')def __init__(self,x,y):self.x = xself.y = ydef show(self):print(self.x,self.y)a = A(1,2)
a.show()print('A',A.__dict__)
# print(a.__dict__)  #字典被省略了
print(a.__slots__)1 2A {'y': <member 'y' of 'A' objects>, 'show': <function A.show at 0x000000972DAF4BF8>, '__init__': <function A.__init__ at 0x000000972DAF4D08>, '__doc__': None, 'x': <member 'x' of 'A' objects>, '__slots__': ('x', 'y'), 'X': 1, '__module__': '__main__'}('x', 'y')

__ slota__告诉解释器,实例的属性豆角什么,一般来说,既要节约内存,最好还是使用元组比较好。

而且实例不可以动态增加属性,类直接增加,因为__slots__是针对实例的。

只能限制当前类的实例,不能继承使用。除非子类里面自己也是定义了__slots__.

__ slots__ = 后面写元组比较好。

应用场景:

使用需要构建在数百万以上的对象,且内存容量较为紧张,实例的属性检查、固定缺不用动态增加的场景。

2、未实现和未实现异常

1)NotImplemented 未实现。是个值,单值。

2)NotImplementedError 未实现异常。

3)只有raise才是无参数的构造。’

print(type(NotImplemented))print(type(NotImplementedError))# raise NotImplemented   #不可以使用,显示的是不属于异常类raise NotImplementedError

3、运算符重载中的反向方法

class A:def __init__(self,x):self.x = xdef __add__(self, other):print(self,'add')return self.x + other.xdef __iadd__(self, other):print(self,'iadd')return A(self.x + other.x)def __radd__(self, other):print(self,'radd')try:return self.x + other.xexcept AttributeError:try:x = int(other)except:x= 0return self.x + xa = A(4)
# b = A(5)
1 + a

执行__ radd__,实现1+a的方法。

字符串也是实现了__ add__ 方法,不过默认处理不了和其他类型的加法,所以就返回NotImplemented。

Python为什么要使用包管理、插件化开发?相关推荐

  1. Android插件化开发之动态加载本地皮肤包进行换肤

    Android插件化开发之动态加载本地皮肤包进行换肤 前言: 本文主要讲解如何用开源换肤框架 android-skin-loader-lib来实现加载本地皮肤包文件进行换肤,具体可自行参考框架原理进行 ...

  2. Android插件化开发之动态加载三个关键问题详解

    本文摘选自任玉刚著<Android开发艺术探索>,介绍了Android插件化技术的原理和三个关键问题,并给出了作者自己发起的开源插件化框架. 动态加载技术(也叫插件化技术)在技术驱动型的公 ...

  3. android开发模式之插件化开发

    一.简介 插件化开发是将整个app拆分成很多模块,这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),最终打包的时候将宿主apk和插件apk分开或者联合打包.由宿主A ...

  4. 插件化开发之资源访问

    插件化开发之资源访问 插件可以是一个安装的apk或未安装的apk, 这里为了简便以安装的apk为例,如果要使用未安装的apk只需要将类加载器更换下基本就可以了 但首先明确下,2个进程间的数据是不能共享 ...

  5. Android之插件化开发

    个人认为: 2017年手淘Atlas插件化项目的开源标志着插件化的落幕, 2018年Android 9.0上私有API的限制几乎称得上是要退出历史主流. 如今的插件化技术朝两个方向发展: 其一,插件化 ...

  6. TinyFrame升级之八:实现简易插件化开发

    本章主要讲解如何为框架新增插件化开发功能. 在.net 4.0中,我们可以在Application开始之前,通过PreApplicationStartMethod方法加载所需要的任何东西.那么今天我们 ...

  7. Android插件化开发之解决OpenAtlas组件在宿主的注冊问题

    Android插件化开发之解决OpenAtlas组件在宿主的注冊问题 OpenAtlas有一个问题,就是四大组件必须在Manifest文件里进行注冊,那么就必定带来一个问题,插件中的组件都要反复在宿主 ...

  8. Android插件化开发指南——Hook技术(一)【长文】

    文章目录 1. 前言 2. 将外部dex加载到宿主app的dexElements中 3. 插件中四大组件的调用思路 4. Hook 2.1 对startActivity进行Hook 2.1.1 AMS ...

  9. Android插件化开发指南——插件化技术简介

    文章目录 1. 为什么需要插件化技术 2. 插件化技术的历史 3. 插件化实现思路 3.1 InfoQ:您在 GMTC 中的议题叫做<Android 插件化:从入门到放弃>,请问这个标题代 ...

最新文章

  1. 400 多行代码!超详细 Rasa 中文聊天机器人开发指南 | 原力计划
  2. ASP.NET Core快速入门(第5章:认证与授权)--学习笔记
  3. mysql 查看autocommit_手把手教你分析Mysql死锁问题
  4. matlab的图形绘制实验,(完整版)Matlab实验7图形绘制
  5. NLPCC 2021 Final Call For Papers
  6. RNA_seq(1)植物转录组实战(中)之subread工具进行序列比对和转录组生物学定量
  7. 华硕电脑桌面没有计算机图标 怎么弄出来,笔记本电脑开机蓝屏没桌面图标的方法...
  8. WebGrid 在asp.net mvc中的使用和理解(译)
  9. ERP操作手册要不要做?
  10. sspanel 常用审计规则
  11. 搭建cocos2d-x-android环境 Windows XP3 + Eclipse + NDKR7(或ndkr7b)+COCOS2DX(没有用到cygwin和minigw)...
  12. 8个微信小程序UI组件框架
  13. oracle磁盘满了怎么办,ORACLE磁盘空间占满解决
  14. 微信小程序设置单个页面自定义头部为背景图
  15. red5简介及基础知识
  16. 表单的js验证框架,只提供提示信息及正则表达式即可自动验证及提示
  17. 郑捷《机器学习算法原理与编程实践》学习笔记(第一章 机器学习基础)
  18. 27-如何让文件夹中的图片显示缩略图
  19. 计算机网络监控技术,实现网络流量监控的核心技术要求
  20. 餐饮加盟行业怎么找加盟商?线上怎么引流?这几招教你线上低成本获客!

热门文章

  1. 奥维地图导入西安坐标_奥维互动地图导入d f文件说明
  2. NESASM教程——第八天——比较
  3. Propagation delay
  4. 机器学习_BP神经网络——全网最全、最细公式推导
  5. 毕业一年的计科人,聊一下毕业一年的前端开发心酸历程(很学zha的那种,不喜就走)
  6. Web 3浪潮席卷东南亚 越南为何会成为“热点”地区
  7. Word 插件中没有Endnote(Cwyw Citation Recognizer)解决办法
  8. Java实现荷兰国旗问题
  9. ATM异地跨行取钱收费大比拼
  10. solr 一些前缀例如:q、fq、df 的用法