物件導向 多型 類方法 反射 (四)

2021-10-01 02:57:43 字數 2180 閱讀 1555

抽象類鴨子型別

類方法isinstance 與 issubclass

反射多型:

指一種型別的事物,擁有多種形態(為了不同的事物呼叫,產生不同的結果)

作用:為了在不知道物件具體型別的情況下,同一物件呼叫方法的規範。

先抽象,再繼承

父類:定製一套統一的規範

子類:遵循父類的統一的規範。

多型的三種表現形式:

繼承父類:耦合度高,程式的可擴充套件性低

繼承抽象類:耦合度極高,程式的可擴充套件性極低

鴨子型別:耦合度低,程式的可擴充套件性高

注意:在python中,不會強制子類必須遵循父類的規範,所以出現了抽象類

抽象類:

在python內建的模組中,有乙個抽象類。

作用:讓子類必須遵循父類的編寫規範。

如何實現:

父類需要繼承abc模組中,metaclass = abc.abcmeta;

在父類的方法中,需要裝飾上 abc.abstrctmethod

注意:子類必須按照父類的編寫規範,缺一不可

鴨子:不同的物件,只要長得像鴨子,動作像鴨子,那他就是鴨子!鴨子型別是多型的一種表現形式。

作用:不同物件,先抽象出相同型別的方法,給他們定製一套統一的規範。

所有的類,在定義時都按照統一的規範進行編寫。

多型的三種表現形式:

繼承父類:耦合度高,程式的可擴充套件性低

繼承抽象類:耦合度極高,程式的可擴充套件性極低

鴨子型別:耦合度低,程式的可擴充套件性高

class

pig:

defeat

(self)

:print

('吧唧吧唧'

)def

speak

(self)

:print

('哼哼哼'

)class

cat:

defeat

(self)

:print

('么雞么雞'

)def

speak

(self)

:print

('喵喵喵'

)class

dog:

defeat

(self)

:print

('添唧添唧'

)def

speak

(self)

:print

('汪汪汪'

)

classmethod和staticmethod都是python直譯器內建的裝飾器。

classmethod:

是乙個裝飾器,給在類內部定義方法中裝飾,將類內部的方法變為』類的繫結方法』。

staticmethod:

靜態方法

是乙個裝飾器,給在類內部定義方法中裝飾,將類內部的方法變為』非繫結方法』。

物件的繫結方法:

由誰來呼叫,由誰來呼叫,會將誰(物件)當作第乙個引數傳入。

類的繫結方法:

由類來呼叫,由誰來呼叫,會將誰(類)當作第乙個引數傳入。

非繫結方法:

可以由物件或類來呼叫,誰來呼叫都是乙個普通的方法(普通函式),方法需要傳入幾個引數,就得傳入幾個。

isinstance 與 issubclass 都是內建模組:

isinstance:

判斷乙個物件是否是另乙個類的例項。

如果是,true;如果不是,false;

issubclass:

判斷乙個類是否是另乙個類的子類

如果是,true;如果不是,false;

class

father

:pass

class

sub:

pass

class

foo(sub)

:pass

#print(isinstance(foo,sub))

#print(issubclass(sub,father))

反射:指的是通過字串對 物件的屬性進行操作

hasatter:通過字串判斷物件的屬性或方法是否存在。

getatter:通過字串獲取物件的屬性或方法。

setatter:通過字串設定物件的屬性或方法。

delatter:通過字串刪除物件的屬性或方法。

注意:反射的四個方法都是內建的

物件導向 反射方法

首先看乙個例子 在物件導向中一般情況下怎麼去調屬性 class student def init self,name,age self.name name self.age age defrun self print class teacher student pass stu1 student z...

物件導向 反射

內建函式 1.isinstance 判斷乙個物件和乙個類有沒有血緣關係class a pass class b a pass a b print isinstance a,b true print isinstance a,a true print type a is b true print ty...

物件導向(五) 類的多型

繼承的好處是乙個指向子類的指標與乙個指向基類的指標是型別相容的 type compatible 繼承的好處是乙個指向子類的指標與乙個指向基類的指標是type compatible的,如以下 所示 include using namespace std class cfather class c pu...