模块化与GIT版本管理

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的特殊符号
 
####
建立分支,须要指明从什么分支上建立什么名字的分支
相关文章
相关标签/搜索