一抬闯、類(lèi)的繼承
1.基本概念
父類(lèi)(超類(lèi)):被繼承的類(lèi)
子類(lèi):去繼承父類(lèi)的類(lèi)
繼承定義:讓子類(lèi)直接擁有父類(lèi)的屬性和方法丙躏,python中所有的類(lèi)都是直接或者間接的繼承自object
注意:繼承后父類(lèi)的東西不會(huì)減少
2.繼承方法和內(nèi)容
-
方法:
- a.class 類(lèi)名(父類(lèi)):....
- b.class 類(lèi)名: == class 類(lèi)名(object):
內(nèi)容:對(duì)象屬性、對(duì)象方法矿辽、類(lèi)的字段拍霜、類(lèi)方法、靜態(tài)方法都可以繼承
-
注意:
如果設(shè)置了__slots__
會(huì)約束當(dāng)前類(lèi)的對(duì)象屬性荤西,并且會(huì)導(dǎo)致當(dāng)前類(lèi)的對(duì)象的dict屬性不存在;繼承后伍俘,
__slots__
的值不會(huì)約束到子類(lèi)的對(duì)象屬性邪锌,但是會(huì)導(dǎo)致子類(lèi)對(duì)象的dict只有在當(dāng)前類(lèi)中添加的屬性
二、類(lèi)的重寫(xiě)
1.添加新的方法
- 直接在子類(lèi)中聲明新的方法癌瘾,新的方法只能通過(guò)子類(lèi)來(lái)使用
2.重寫(xiě)
a.子類(lèi)繼承父類(lèi)的方法觅丰,在子類(lèi)中去重新實(shí)現(xiàn)這個(gè)方法的功能 -- 完全重寫(xiě)
b.在子類(lèi)方法中通過(guò)super().父類(lèi)方法去保留父類(lèi)對(duì)應(yīng)的方法的功能
3.類(lèi)中的函數(shù)的調(diào)用過(guò)程
-
類(lèi).方法(), 對(duì)象.方法()
先看當(dāng)前類(lèi)是否有這個(gè)方法,如果有就直接調(diào)用當(dāng)前類(lèi)中相應(yīng)的方法妨退;
如果沒(méi)有就去當(dāng)前的父類(lèi)中去看有沒(méi)有這個(gè)方法妇萄,如果有就調(diào)用父類(lèi)的這個(gè)方法;
如果父類(lèi)中也沒(méi)有這個(gè)方法咬荷,就去父類(lèi)的父類(lèi)中找嚣伐,依次類(lèi)推直到找到為止。
如果找到基類(lèi)object萍丐,還沒(méi)有找到這個(gè)方法,程序才異常
4.添加屬性
a.添加字段:
就直接在子類(lèi)中聲明新的字段b.添加對(duì)象對(duì)象屬性:
子類(lèi)是通過(guò)繼承父類(lèi)的init方法來(lái)繼承的父類(lèi)的對(duì)象屬性
三放典、運(yùn)算符重載
1.定義
- 運(yùn)算符重載: 通過(guò)實(shí)現(xiàn)類(lèi)響應(yīng)的魔法方法逝变,來(lái)讓類(lèi)的對(duì)象支持相應(yīng)的運(yùn)算符(+, -, > ,< 等)
2.實(shí)現(xiàn)方法
# __gt__就是 > 對(duì)應(yīng)的魔法方法
def __gt__(self, other):
# self -> 指的是大于符號(hào)前面的值, other -> 指的是>符號(hào)后面的值
return self.score > other.score
# __lt__是 < 對(duì)應(yīng)的魔法方法
# 注意:gt和lt只需要實(shí)現(xiàn)一個(gè)就可以了
def __lt__(self, other):
return self.score < other.score
def __add__(self, other):
return self.score + other.score
四奋构、內(nèi)存管理機(jī)制
1. python中的內(nèi)存管理
定義:內(nèi)存管理 --> 自動(dòng)管理 --> 垃圾回收機(jī)制
內(nèi)存結(jié)構(gòu)中分棧區(qū)間和堆區(qū)間壳影,棧區(qū)間中內(nèi)存是系統(tǒng)自動(dòng)開(kāi)啟自動(dòng)釋放。堆區(qū)間的內(nèi)存需要手動(dòng)申請(qǐng)手動(dòng)釋放弥臼。
python中的數(shù)據(jù)都是存在堆中的宴咧,數(shù)據(jù)的地址都是在棧區(qū)間。python中垃圾回收機(jī)制是用來(lái)管理堆中的內(nèi)存的釋放
2. 內(nèi)存管理步驟
a.內(nèi)存的開(kāi)辟
python中將值賦給變量的是径缅,會(huì)先在堆中開(kāi)辟空間將數(shù)據(jù)存起來(lái)掺栅,然后再數(shù)據(jù)對(duì)應(yīng)的地址返回給變量,存在棧中纳猪。
但是如果數(shù)據(jù)是數(shù)字和字符串氧卧,會(huì)先緩存區(qū)中查看這個(gè)數(shù)據(jù)之前是否已經(jīng)創(chuàng)建過(guò),如果沒(méi)有就去創(chuàng)建空間存數(shù)據(jù)氏堤,然后將地址返回沙绝。
如果之前已經(jīng)創(chuàng)建過(guò)就直接將之前的地址返回b.內(nèi)存的釋放 --> 垃圾回收機(jī)制
系統(tǒng)每隔一定的時(shí)間就會(huì)去檢測(cè)當(dāng)前程序中所有的對(duì)象的引用計(jì)數(shù)值是否為0;
如果對(duì)象的引用計(jì)數(shù)是0對(duì)象對(duì)應(yīng)的內(nèi)存就會(huì)被銷(xiāo)毀,如果不是0就不銷(xiāo)毀c.引用計(jì)數(shù)
每一個(gè)對(duì)象都有引用計(jì)數(shù)屬性闪檬,用來(lái)存儲(chǔ)當(dāng)前對(duì)象被引用的次數(shù)星著。
可以通過(guò)sys模塊中的getrefcount去獲取一個(gè)對(duì)象的引用計(jì)數(shù)值
五、抽象類(lèi)和抽象方法
1.抽象類(lèi)
定義:只能被繼承不能實(shí)例化(不能創(chuàng)建對(duì)象)
聲明:類(lèi)繼承abc模塊中的ABCMeta粗悯,繼承的時(shí)候需要加參數(shù)metaclass虚循。
并且要通過(guò)abstractmethod來(lái)聲明抽象方法例子:
import abc
class Shape(metaclass=abc.ABCMeta):
# 聲明抽象方法
@abc.abstractmethod
def draw(self):
pass
@abc.abstractmethod
def area(self):
pass
2.抽象方法
- 定義:聲明的時(shí)候不用實(shí)現(xiàn),在子類(lèi)中必須去重寫(xiě)的方法
- 注意:子類(lèi)繼承一個(gè)抽象類(lèi)为黎,必須在子類(lèi)中實(shí)現(xiàn)抽象類(lèi)中所有的抽象方法
- 例子:
class Circle(Shape):
def draw(self):
print('畫(huà)圖形')
def area(self):
print('面積')