多繼承
python中的類支持多繼承(讓一個(gè)類同時(shí)繼承多個(gè)類)
多繼承的時(shí)候千劈,子類只能繼承第一個(gè)父類的所有屬性和方法倍啥,后面的父類中只有字段和方法可以被繼承
運(yùn)算符
1.運(yùn)算符
python所有的類型都是類,所以所有的數(shù)據(jù)都是對(duì)象巍棱;
python中使用任意的運(yùn)算符都是在調(diào)用相應(yīng)類中的相應(yīng)方法潘明,每一個(gè)運(yùn)算符對(duì)應(yīng)什么方法是固定的,
某種數(shù)據(jù)是否支持某個(gè)運(yùn)算符操作就看這個(gè)數(shù)據(jù)類型是否實(shí)現(xiàn)了對(duì)應(yīng)方法
2.運(yùn)算符重載指的是在不同的類中實(shí)現(xiàn)同樣的運(yùn)算符對(duì)應(yīng)的函數(shù)
(類的對(duì)象默認(rèn)情況下只支持:==病曾,!=)
add(self, other): — 重載‘+’運(yùn)算
lt(self, other): — 重載‘<’運(yùn)算
gt(self, other): — 重載‘>’運(yùn)算
注意:< 和 > 只需要重載其中一個(gè)牍蜂,另一個(gè)自動(dòng)支持;重載運(yùn)算符中的self是當(dāng)前類的對(duì)象也指向運(yùn)算符‘+’泰涂,‘<’鲫竞,‘>’,...前面的對(duì)象逼蒙,other指向運(yùn)算符后面的數(shù)據(jù)从绘,用戶可以根據(jù)運(yùn)算規(guī)則選擇任意類型的數(shù)據(jù)。
淺拷貝和深拷貝
1.直接賦值
將變量中的地址直接賦給新的變量是牢;賦值后兩個(gè)變量的地址相同
2.拷貝
不管是淺拷貝還是深拷貝都會(huì)對(duì)原數(shù)據(jù)進(jìn)行賦值產(chǎn)生新的地址
3.淺拷貝
字符串僵井、列表和元祖的切片;對(duì)象.copy()驳棱;copy模塊中的copy方法都是淺拷貝
淺拷貝只拷貝當(dāng)前對(duì)象批什,不會(huì)對(duì)子對(duì)象進(jìn)行拷貝
4.深拷貝
copy模塊中的deepcopy方法是深拷貝
枚舉
(在別的語(yǔ)言中,枚舉是一種數(shù)據(jù)類型)
python中可以通過(guò)繼承enum模塊中的Enum創(chuàng)建枚舉類型的數(shù)據(jù)社搅,并通過(guò)unique讓枚舉數(shù)據(jù)的‘值’唯一驻债。
枚舉值的特點(diǎn):
1.可以通過(guò)有意義的屬性名直接顯示數(shù)據(jù)
2.每個(gè)數(shù)據(jù)的值不能修改
3.可以做到不同的數(shù)據(jù)的值唯一
python的內(nèi)存管理
1.內(nèi)存的開辟
內(nèi)存區(qū)間分為棧區(qū)間和堆區(qū)間;棧區(qū)間的內(nèi)存自動(dòng)開辟自動(dòng)釋放形葬,堆區(qū)間的內(nèi)存需要程序員手動(dòng)開辟合呐,手動(dòng)釋放;
但是python已經(jīng)將堆區(qū)間內(nèi)存的開辟和釋放自動(dòng)化了
a.當(dāng)給變量賦值的時(shí)候笙以,系統(tǒng)會(huì)先在堆區(qū)間中開辟空間將數(shù)據(jù)存起來(lái)淌实,然后再將數(shù)據(jù)在堆中的地址存到變量中,變量存在棧區(qū)間源织;
b.數(shù)字和字符串?dāng)?shù)據(jù)在開辟空間的時(shí)候翩伪,會(huì)先檢測(cè)內(nèi)存中之前是否已經(jīng)有這個(gè)數(shù)據(jù),如果有就直接使用之前的數(shù)據(jù)谈息,沒(méi)有才重新開辟空間保存數(shù)據(jù)
2.內(nèi)存的釋放
棧區(qū)間:全局棧區(qū)間在程序結(jié)束后銷毀缘屹,函數(shù)棧區(qū)間在函數(shù)調(diào)用結(jié)束后銷毀(自動(dòng))
堆區(qū)間:看一個(gè)對(duì)象是否銷毀,就看這個(gè)對(duì)象的引用計(jì)數(shù)是否為0侠仇;如果一個(gè)對(duì)象的引用為0轻姿,這個(gè)對(duì)象就會(huì)銷毀(垃圾回收機(jī)制)
(垃圾回收機(jī)制)
注意:python中針對(duì)對(duì)象的循環(huán)引用已經(jīng)做了處理犁珠,程序員不需要寫額外的代碼來(lái)解決循環(huán)引用問(wèn)題
(getrefcount() - 獲取引用計(jì)數(shù))