標籤:amount 接頭 put 發送 網路通訊 ble UI 類變數 拼接
目錄:
一、模組補充
shutil:檔案複製模組;進行檔案copy、壓縮;使用方法:將檔案內容拷貝到另一個檔案中,可以部分內容shutil.copyfileobj(fsrc,fdst[,length]) #檔案對象;樣本: 先開啟檔案再進行copy; import shutilf = open(‘example.log‘)f2 = open(‘example_new.log‘,‘w‘)shutil.copyfileobj(f,f2)shutil.copyfile(src, dst)拷貝檔案直接copy檔案名稱;shutil.copyfile(src,dst)shutil.copyfile(‘example_new.log‘,‘example_new2.log‘)shutil.copymode(str,dst)僅拷貝許可權,內容、使用者和組均不變;shutil.copymode(‘example_new.log‘,‘example_new2.log‘)shutil.copystat(src, dst)拷貝狀態的資訊,包括:mode bits, atime, mtime, flagsshutil.copy(src, dst)拷貝檔案和許可權shutil.copy2(src, dst)拷貝檔案和狀態資訊shutil.ignore_patterns(*patterns)shutil.copytree(src, dst, symlinks=False, ignore=None)遞迴的去拷貝檔案例如:copytree(source, destination, ignore=ignore_patterns(‘*.pyc‘, ‘tmp*‘))shutil.rmtree(path[, ignore_errors[, onerror]])遞迴的去刪除檔案shutil.move(src, dst)遞迴的去移動檔案shutil.make_archive(base_name, format,...)建立壓縮包並返迴文件路徑,例如:zip、tarbase_name: 壓縮包的檔案名稱,也可以是壓縮包的路徑。只是檔案名稱時,則儲存至目前的目錄,否則儲存至指定路徑,如:www =>儲存至當前路徑如:/Users/wupeiqi/www =>儲存至/Users/wupeiqi/format:壓縮包種類,“zip”, “tar”, “bztar”,“gztar”root_dir:要壓縮的檔案夾路徑(預設目前的目錄)owner:使用者,預設目前使用者group:組,預設當前組logger:用於記錄日誌,通常是logging.Logger對象樣本:#將 /Users/wupeiqi/Downloads/test 下的檔案打包放置當前程式目錄import shutilret = shutil.make_archive("wwwwwwwwww", ‘gztar‘, root_dir=‘/Users/wupeiqi/Downloads/test‘)#將 /Users/wupeiqi/Downloads/test 下的檔案打包放置 /Users/wupeiqi/目錄import shutilret = shutil.make_archive("/Users/wupeiqi/wwwwwwwwww", ‘gztar‘, root_dir=‘/Users/wupeiqi/Downloads/test‘)樣本:import zipfile# 壓縮z = zipfile.ZipFile(‘laxi.zip‘, ‘w‘)z.write(‘a.log‘)z.write(‘data.data‘)z.close()# 解壓z = zipfile.ZipFile(‘laxi.zip‘, ‘r‘)z.extractall()z.close()樣本:import tarfile# 壓縮tar = tarfile.open(‘your.tar‘,‘w‘)tar.add(‘/Users/wupeiqi/PycharmProjects/bbs2.zip‘, arcname=‘bbs2.zip‘)tar.add(‘/Users/wupeiqi/PycharmProjects/cmdb.zip‘, arcname=‘cmdb.zip‘)tar.close()# 解壓tar = tarfile.open(‘your.tar‘,‘r‘)tar.extractall() # 可設定解壓地址tar.close()shutil 對壓縮包的處理是調用 ZipFile 和 TarFile 兩個模組來進行的,詳細:打包:檔案名稱加日期可以自行拼接;shutil.make_archive(‘day5‘,‘zip‘,‘c:\\Users\Administrator\s16\day5‘)跟json差不多,是實現不現語言或程式之間進行資料交換的協議;xml的格式如下,就是通過<>節點來區別資料結構的;<data><country name="Liechtenstein"><rank updated="yes">2</rank><year>2008</year><gdppc>141100</gdppc><neighbor name="Austria" direction="E"/><neighbor name="Switzerland" direction="W"/></country></data>xml的處理:xml協議在各個語言裡的都是支援的,在python中可以用以下模組操作xmlimport xml.etree.ElementTree as ETtree = ET.parse(‘xmltest.xml‘) #解析root = tree.getroot()print(root.tag)print(dir(root))遍曆xml文檔:for child in root:print(child tag,child.attrib)for i in child:print(i.tag,i.text,i.attrib)只遍曆year節點;for node in root.iter(‘year‘)print(node.tag, node.text)只遍曆country節點:for node in root.iter(‘year‘)print(node.tag, node.text, node.attrib)修改:for node in root.iter(‘yesr‘):new_year = int(node.text) + 1node.text = str(new_year)node.set("updated","yes")tree.write("xmltest.xml")刪除nodefor country in root.findall(‘country‘):rank = int(country.find(‘rank‘).text)if rank > 50:root.remove(country)tree.write(‘output.xml‘,encoding=‘utf-8‘) hashlib:hash加密模組;hmac模組:主要用於在互連網中的訊息認證;散列訊息鑒別碼,簡稱HMAC,是一種基於訊息鑒別碼MAC(Message Authentication Code)的鑒別機制。使用HMAC時,訊息通訊的雙方,通過驗證訊息中加入的鑒別密鑰K來鑒別訊息的真偽;一般用於網路通訊中訊息加密,前提是雙方先要約定好key,就像接頭暗號一樣,然後訊息發送把用key把訊息加密,接收方用key + 訊息明文再加密,拿加密後的值 跟 寄件者的相對比是否相等,這樣就能驗證訊息的真實性,及寄件者的合法性了。subprocess:import subprocesssubprocess.run(["df",‘-h‘],returncode=1) #自動拼接並輸出;subprocess.run(["df","-h","|","grep","/dev/sda1"]) #有管道會報錯;subprocess.run("df -h | grep /dev/sda1",shell=True) #shell=True表示直接調用shell,而不會解析執行命令,返回命令執行狀態,0 or 非0subprocess.call("df -h | grep /dev/sda1",shell=True)接收字串格式命令,返回元組形式,第1個元素是執行狀態,第2個是命令結果;ba = subprocess.getstatusoutput("df -h | grep /dev/sda1")run, shell=Truecallcheck_callgetstatusoutputp = Popen()stdout = subprocess.PIPE, stderr = ....env = {} #後跟字典;cwd = {}prexec_fn =p.stdout.read()p.poll()p.wait()p.communicate(timeout=3)re:Regex;re.match("al","alex li") #前面是規則,後面是要匹配的字串;<_sre.SRE_Match object; span=(0, 2), match=‘al‘>a = re.match("^.+","alex\n li")a.group() #可列印匹配到的值;re.search("i$","alex\n li")re.match:從頭開始匹配;re.search:匹配整行;re.findall(‘\W+‘,‘192.168.0.23‘)re.split(‘\W+‘,‘192.168.0.23‘)re.sub 匹配並替換;re.sub(‘\d{4}‘,‘1987‘,‘i was born in 1996-05-23,ys is 1919‘,count=1)#預設會全部替換;count指定替換多少次;‘i was born in 1987-05-23,ys is 1919‘>>> re.search(r"\root\\","\root\\alex\test")<_sre.SRE_Match object; span=(0, 5), match=‘\root\\‘>‘.‘ 預設匹配除\n之外的任意一個字元,若指定flag DOTALL,則匹配任一字元,包括換行‘^‘ 匹配字元開頭,若指定flags MULTILINE,這種也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)‘$‘ 匹配字元結尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以‘*‘ 匹配*號前的字元0次或多次,re.findall("ab*","cabb3abcbbac") 結果為[‘abb‘, ‘ab‘, ‘a‘]‘+‘ 匹配前一個字元1次或多次,re.findall("ab+","ab+cd+abb+bba") 結果[‘ab‘, ‘abb‘]‘?‘ 匹配前一個字元1次或0次‘{m}‘ 匹配前一個字元m次‘{n,m}‘ 匹配前一個字元n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 結果‘abb‘, ‘ab‘, ‘abb‘]‘|‘ 匹配|左或|右的字元,re.search("abc|ABC","ABCBabcCD").group() 結果‘ABC‘‘(...)‘ 分組匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 結果 abcabca456c‘\A‘ 只從字元開頭匹配,re.search("\Aabc","alexabc") 是匹配不到的‘\Z‘ 匹配字元結尾,同$‘\d‘ 匹配數字0-9‘\D‘ 匹配非數字‘\w‘ 匹配[A-Za-z0-9]‘\W‘ 匹配非[A-Za-z0-9]‘s‘ 匹配空白字元、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 結果 ‘\t‘‘(?P<name>...)‘ 分組匹配 re.search("(?P<province>[0-9]{4})(?P<city>[0-9]{2})(?P<birthday>[0-9]{4})","371481199306143242").groupdict("city") 結果{‘province‘: ‘3714‘, ‘city‘: ‘81‘, ‘birthday‘: ‘1993‘}
三、物件導向
特性:封裝、繼承、多態
編程範式:
編程是程式員用特定的文法+資料結構+演算法組成的代碼來告訴電腦如何執行任務的過程;一個程式是程式員為了得到一個任務結果而編寫的一組指令的集合;而實現一個任務的方式有很多種不同的方式,對這些不同的編程方式的特點進行歸納總結得出來的編程方式類別,即為編程範式;
大多數語言只支援一種編程範式,也有些語言也可以同時支援多種編程範式;兩種最重要的編程範式分別是面向過程和物件導向編程;
面向過程:
面向過程編程依賴過程;一個過程包含一組要被進行計算的步驟,面向過程又被稱為top-down languages;
物件導向:
OOP(object oriented programing)編程是利用"類"和"對象"來建立各種模型來實現對真實世界的描述;
物件導向的優點:
可以使程式的維護和擴充變得更簡單;並且可以大大提高程式的開發效率;
基於物件導向的程式可以使他人更加容易理解代碼邏輯;
Class類:
一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義的這些對象的都具備的屬性(variables(data))、共同的方法;
Object對象:
一個對象一個類的執行個體化後執行個體;一個類必須經過執行個體化後方可在程式中調用;一個類可以執行個體化多個對象,每個對象亦可以有不同的屬性;
Encapsulation: 封裝
在類中對資料的賦值、內部調用對外部使用者是透明的,這使類變成了一個膠囊或容器,裡麵包含著類的資料和方法;
Inheritance: 繼承
一個類可以派生出子類,在這個父類裡定義的屬性、方法自動被子類繼承;
Polymorphism: 多態
python原生就是多態的;一個介面,多種實現;
樣本:class Dog(object):age = 22 #類變數,存在類的記憶體位址裡,可以被所有執行個體共用引用;def __init__(self,name,type): #初始化函數(建構函式)self.name = name # d.name = nameself.type = type # d.type = typedef balk(self): # self = dprint(‘[%s] I am a dog!‘%self.name)def eat(self,food):print("[%s] eating [%s]"%(self,name,food))d = Dog("ys","zang ao")print(d.name, d.type)d.balk()d.eat(‘sandwish‘)d.name=‘ddd‘print(d.name,d.age)
封裝:
封裝是物件導向的特徵之一,是對象和類概念的主要特性;
類變數:
存在類的記憶體位址裡,可以被所有執行個體共用引用;可以是一些共同屬性;
作用:
作為預設公有屬性;靜態欄位;
全域修改或增加新的屬性;
樣本:class People(object):nationality = "CN"def __init__(self,name,age,job):passp = People("liuhao",22,‘IT‘)p2 = People("yanshui",22,‘IT‘)p.nationality = "JP"print(p.nationallity)p2.hobbie = "Big baojian"People.weapon = "Big baojian" #增加全域屬性;print(p.weapon)
執行個體變數:(成員屬性)
與類變數相反;建構函式裡面的所有對象都是執行個體變數;
每個執行個體存在自己記憶體空間裡的屬性;
p2.hobbie = "Big baojian"
公有屬性:==》 類變數;
私人屬性:
不想被別人訪問到的屬性;
__sex: 表示私人屬性,僅能在內部各函數(方法)中調用;
隱藏一些功能的實現細節,只給外部暴露調用介面;
繼承:
物件導向編程(OOP)語言的一個主要功能就是繼承,可以使用現有類的所有功能;並在無需重新編寫原來的類的情況下對這些功能進行擴充;
通過繼承建立的新類稱為"子類"或"衍生類別";
被繼承的類稱為"基類"、"父類"或"超類";
繼承的過程,就是從一般到特殊的過程;
繼承的實現兩種方式:
繼承
組合
在有些OOP語言中,一個子類可以繼承多個基類,一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現;
繼承概念的實現方式主要有2類:
實現繼承
是指使用基類的屬性和方法而無需額外編碼的能力;
注意:兩個類之間的關係應該是"屬於"關係;
介面繼承
是指僅使用屬性和方法的名稱,但是子類必須提供實現的能力(子類重構父類的方法);
抽象類別就是父類,僅定義由子類建立的一般屬性和方法;
樣本:class SchoolMember(object):members = 0def __init__(self,name,age,sex):self.name = nameself.age = ageself.sex = sexSchoolMember.members += 1print("初始化了一個新學校成員",self.name)def tell(self):info = """------info of %s ---------name: %sage: %ssex:%s"""%(self.name,self.name.self.age,self.sex)print(info)def __del__(self): #析構方法:print("%s 被開除了"%self.name)SchoolMember.members -= 1class Teacher(SchoolMember): #繼承def __init__(self,name,age,sex,salary): #手動調用父類方法;SchoolMember.__init__(self,name,age,sex,salary)#self.name = name#self.age = age#self.sex = sexself.salary = salarydef teaching(self,course):print("%s is teaching %s"%(self.name,self.course))class Student(SchoolMember):def __init__(self,name,age,sex,grande)SchoolMember.__init__(self,name,age,sex,grande)self.grande = grandedef pay_tuition(self,amount):self.paid_tuition = amountprint(‘stduent %s has paid tutuion amount %s‘%(self.name,amount))t = Teacher("Alex",22,"F",3000)s = Student("liuhao",24,"M","pays16")s1 = Student("yanshuai",46,"F","pys26")s2 = Student(‘Nining‘,32,‘F‘,‘pys26‘)del s2 #刪除一個執行個體;t.tell()s.tell()s1.tell()t.teaching("python")s.pay_tuition(11000)print(t.name)print(t.age)print(t.salary)print(SchoolMember.members)
繼承:
1、直接調用父類方法;
2、繼承父類方法並重構父類方法,先重構,再重構的方法裏手動調用父類方法;
3、可以定義子類自己的方法;
4、析構方法;
多繼承:
一般最多繼承兩個;
樣本:class Course(object):course_name = "Python 自動化"period = "7m"outline = "sfdskljjklfsdj"test = 321class Student(SchoolMember,Course,my_teacher):test = 123def __init__(self,name,age,sex,grande)SchoolMember.__init__(self,name,age,sex,grande)self.grande = grandeself.my_teacher =teacherdef pay_tuition(self,amount):self.paid_tuition = amountprint(‘stduent %s has paid tutuion amount %s‘%(self.name,amount))c = Course() #可達到建構函式效果;c.name = "Linux"s = Student("liuhao",24,"M","pays16",t)s.my_new_teacher = tprint(s.course_name, s.outline)print(s.test)print("my teacher",s.my_teacher.name)
python模組補充、物件導向