Dec.11-->study notepad
#~~~~~~~~~~~~~~~~~~~~~~~~
part1:
按需加载
运行时,根据用户需求(提供字符串),找到模块的资源动态的加载起来
内建函数__import__(name,globals=None,locals=None,fromlist=(),level=0)
name模块名,
import语句本质上就是调用这个函数,不鼓励直接使用,建议importlib.import_module()
例如sys = __import__('sys') 等价于import sys
importlib.import_module()
importlib.import_module(name,package=None)
支持绝对导入和相对导入,package必须设置
import importlib
def plugin_load(plugin_name:str,sep=':'):
m,_,c = plugin_name.partition(sep)
mod = importlib.import_module(m)
cls = getattr(mod,c)
return cls() #返回实例
if __name__ == '__main__':
#装载插件
a = plugin_load('test:A')
a.showme() #拿到test模块的方法
上述就是插件化编程的核心代码
插件化变成技术:
反射:运行时获取类型的信息,能够动态维护类型数据
动态import:推荐使用importlib模块,实现动态import的能力
多线程:能够开启一个线程,等待用户输入
加载的时机:
[1]程序启动时,启动程序时,扫描固定的目录,加载插件
[2]程序运行过程当中,接受用户的指令或者请求,启动相应的插件
二者各有利弊,能够互相综合
应用:
实现基本功能的开发后,对其进行功能的加强,后期调用其余插件,方便扩展
插件化开发:
考虑软件功能,后期插件化增长
API(:暴露出来的功能,函数or方法)[外界能方便调用,或者说是暴露给外界使用]
插件化:程序的功能轻量化,实现定制化需求
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
part2:
当实例过多时,使用__slots__来节省内存,__slots__针对实例,只影响当前类的实例,对类属性无效
__slots__不影响继承,应用场景,数百万以上对象,内存紧张时
不受继承,子类即失效
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
NotImplemented:未实现范
NotImplementedError:未实现异常
操做数的运算符重载的反向方法,类型须要考虑
Notlmplemented:单值,是NotlmpementedType类的实例
NotlmplementedError,是个异常 类型,返回type(类型)
运算符有重载的反向方法
若两个对象都有__add__方法,则执行正常,若是一个没有则,会去向另外一个查找对应的__add__方法,可是只有一方知足了__add__方法,须要判断另外一方是不是能够执行__add__方法的对象
class A:
def __init__(self,x)
self.x = x
def __add__(self,other)
try:
x = other.x
return self.x +other.x
except AttributeError:
try:
x = int(other) #对其进行类型转换
except :
x = 0 #若类型转换也失败,则直接强转对象为0,并进行其对应的执行方法
return self.x + x
def __radd__(self,other):
return self + other
解决a + 1 的类型错误
'abc' + a,字符串也实现了__add__方法,不过默认是处理不了和其余类型的加法,就返回Notlmplemented
当类型错误时,能够考虑取默认值 =0
方法相似功能,能够考虑返回另外一个实现方法,避免代码重复
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
part3:
版本管理(GIT,SVN):
GIT:基于web的管理中心
使用GIT的Gogs来搭建私服:
linux 安装git 指令: yum install git
windows 安装对应的版本便可
Repository仓库,版本库
git初始化后,会在当前目录生成一个.git目录,这就是版本库
Workspace工做空间,工做区
.git所在的目录就是工做区,通常式项目的根目录
index索引
介于工做区和版本库之间,暂存修改的
remote 远程版本库
网络上的另外一个版本库,能够和本地库交互
#~~~~~~~~~~~~~~~~~~~~~~~~
使用:
在当前目录中增长了一个.git目录中个文件目录中的文件不要自行修改,这个目录通常是项目的根目录--> git init
添加文件:git add ????
单个文件添加,这一步是把文件的当前变化增长到缓存区中,也就是之后这个文件须要版本库来跟踪管理,这不是提交,可是文件还能够继续修改,还能够添加新的被跟踪文件,必需要add才能把这些改变加入到缓存区中
批量添加 git add.
. 点号 表明当前目录,这条命令将传递添加当前目录以及其子目录全部文件,只要是目录就会被递归的添加该目录下的文件和子目录
查看状态 --> git status
git的文件分类:
追踪的Tracked,已经加入版本库的文件
未追踪的UNtracked,为加入到版本库的文件
提交代码
git commit -m "???"
commit提交更改到版本库
-m 填写本第二天志消息,必须写,
一个文件commit过一次后,再次对此文件发起修改,修改完以后还须要再次add -->commit该文件到缓存区中
git的提交
暂存变动:add做用是把心文件或者文件新的改动添加到暂存区stage,也就是添加到index中
提交更改:commit提交的是暂存区中的改动,而不是物理文件目前的改动,提交到当前分支,默认是master分支
也可使用这条命令:git commit -a 将上两步合为一步
-a ,-all会把全部跟踪的文件的改动自动暂存,而后committ
增补
第二次提交后,若忘记加入一个文件???.htm
git add ???.htm
git commit --amend
--amend 修改
git log 查看版本库中提交的历史记录
diff比较
查看各类差别
git diff 查看被跟踪文件未暂存的修改,比较暂存区和工做区
git diff --cached 查看被跟踪文件暂存的修改,比较暂存区和上一次commit的差别
git diff HEAD,查看被跟踪文件,比较工做区和上一次commit的差别,HEAD指代最后一次commit
HEAD
HEAD,指代最后一次commit
HEAD^ ,指代上一次提交
HEAD ^^ 指代上上一次提交
上n次提交 表示为HEAD~n
检出和重置
命令
|
说明
|
git checkout
|
列出暂存区能够被检出的文件
|
git checkout file
|
从暂存区检出文件到工做区,就是覆盖工做区文件,能够指定检出的文件,但不是清楚stage
|
git checkout commit file
|
检出某个commit的指定文件到暂存区和工做区 |
git checkout
|
检出暂存区的全部文件到工做区
|
git checkout about ??? 从暂存区检出到工做区,工做区有了暂存区文件的内容
git checkout HEAD ??? 使用当前分支的最后一次commit检出覆盖暂存区和工做区
命令
|
说明
|
git reset
|
列出将被reset的文件
|
git reset file
|
重置文件的暂存区,和上一次commit一致,不影响工做区
|
git reset --hard
|
重置暂存区和工做区,与上一次commit保持一致
|
echo "hello" > about.htm
git add about.htm 添加到暂存区
git reset about.htm 使用最后一次提交到覆盖到暂存区
cat about.htm 工做区文件有内容
git add about.htm 添加到暂存区
git reset --hard 重置暂存区与工做区为上一次commit
cat about.htm 工做区无内容
命令
|
说明
|
git reflog
|
显示commit的信息,只要HEAD发生变化,就能够在这里看到
|
git reset commit
|
重置当前分支的HEAD为指定commit,同时重置暂存区,但工做区不变
|
git reset --hard [commit]
|
重置当前分支的HEAD为指定commit,同时重置暂存区和工做区,与指定commit一致
|
git reset --keep [commit]
|
重置当前HEAD为指定commit ,但保持暂存区和工做区不变
|
移动和删除
git my src dest更名,直接把更名的改动放入暂存区
git rm file 会同时在版本库和工做目录中删除文件,真删除
git rm --cached file将文件从暂存转成未暂存,从版本库中删除,但不删除工做的该文件,即文件恢复成不追踪的状态
以上都只是改动,只有commit 后才算是真的改动了
#~~~~~~~~~~~~~~~~~~~~~
push到服务器
更改本地用户名和邮箱
git config --global user.name "name"
git config --global user.email "name@???.com"
这些内容对应的是~/.gitconfig文件,是用户级别的配置文件
关联远程版本库
git remote add origin http://192.168.1.37:3000/gogs/repolist.git
远程版本库名origin,这是个习惯用法,将创建origin和后面url的映射,这些信息保存在.git/config文件的新的端[remote "origin"]中
.git/config 这个文件是版本库级别设置文件,这里的设置具备最高优先级
推送数据
git push -u origin master
输入密码就能够链接到远程仓库
私有的仓库,必须登陆,只能本身看,为了方便,修改成公有的
-u 第一次登录的时候加上,之后就能够不使用-u参数 git push origin master
存储
命令
|
说明 |
git stash
|
暂时存储最后一次提交后的变化,放入栈中
|
git stash pop
|
从栈中取出刚才保存的变化,并合并 |
分支branch
多人协做一块儿开发,开发项目中不一样的独立的功能,这些功能可能须要好几天才能完成
代码中至少有一个分支,就是主干分支或称主分支Master,默认都是在主分支上开发
图中节点表示每一次提交
#~~~~~~~~~~~~~~~~~~~~~~
引入分支,解决定制版本后期分版本维护
分支名的条件要求:
分支名在版本库中必须惟一
不能以-开头
可使用/,可是不能以他结尾,被它分割的名称不能以.开头
不能使用两个连续的..
不能包含任何空白字符,git的特殊符号
####
建立分支,须要指明从什么分支上建立什么名字的分支