首页 > 技术文章 > 模块化与GIT版本管理

spidermansam 2017-12-15 16:14 原文

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的特殊符号
 
####
创建分支,需要指明从什么分支上创建什么名字的分支
 

推荐阅读