zoukankan      html  css  js  c++  java
  • 模块化与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的特殊符号
     
    ####
    创建分支,需要指明从什么分支上创建什么名字的分支
     
  • 相关阅读:
    Discuz论坛自动发帖机
    C#测试数据库连接是否成功
    JS重写提示框(confirm)
    随笔 选择
    随笔 诚实
    web项目经理手册【1】版本控制流程
    Asp.net多层架构中的变量引用与传递
    ASP.NET跨页面传值技巧总结
    web项目经理手册【3】Code Review
    web项目经理手册【7】项目经理需要铭记在心的话
  • 原文地址:https://www.cnblogs.com/spidermansam/p/8043628.html
Copyright © 2011-2022 走看看