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的特殊符號
####
建立分支,須要指明從什麼分支上建立什麼名字的分支