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,为加入到版本库的文件
忽略的Ignored,git不在关注的文件,例如一些临时文件,忽略文件不需要自己写,python的可以参考https://github.com/github/gitignore/blob/master/Python.gitignore
提交代码
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的特殊符号
####
创建分支,需要指明从什么分支上创建什么名字的分支