python物件導向三大特徵(封裝,繼承,多型)

2021-10-09 20:52:05 字數 3373 閱讀 6258

目錄繼承

繼承方法重寫 多型

python是物件導向的語言,也支援物件導向程式設計的三大特性:繼承、封裝、多型。

*封裝(隱藏)

隱藏物件的屬性和實現細節,只對外提供必要的方法,相當於將「細節封裝起來」,只對外暴露「相關呼叫方法」。

通過「私有屬性,私有方法「的方式,實現」封裝」,python追求簡潔的語法,沒有嚴格的語法級別的「訪問控制符」。

*繼承

繼承可以讓子類具有父類的特性,提高**的重用性。

從設計上是一種增量進化,原有父類設計不變的情況下,可以增加新功能,或者改進已有的演算法。

*多型

多型是指同乙個方法呼叫由於物件不同會產生不同的行為,生活中這樣的例子比比皆是:同樣是休息,人不同休息的方法不同,有的休息是睡覺,有的休息是玩遊戲等等。

繼承是物件導向程式設計的重要特徵,也是實現「**復用」的重要手段。

如果乙個新類繼承自乙個設計好的類,就直接具備了已有類的特徵,就大大降低類工作難度,已有的類,稱為「父類或者基類」,新的類,稱為「子類或者派生類」。

語法格式:

python支援多重繼承,乙個子類可以繼承多個父類,繼承的語法格式如下:

class  子類類名(父類1[,父類2,....]):

類體如果在類定義中沒有指定父類,則預設父類是object類,也就是說,object是所有類的父類,裡面定義了一些所有類共有的預設實現,比如:__new__();

定義子類時,必須在其他建構函式中呼叫父類的建構函式,呼叫格式如下:

父類名.__init__(self,引數列表)

python支援多重繼承,乙個子類可以有多個」直接父類「。這樣,就具備了「多個父類」的特點,但是由於,這樣會被「類的整體層次」搞的異常複雜,盡量避免使用。檢視類多重繼承結構

成員繼承:子類繼承父類除構造方法之外的所有成員。

方法重寫:子類可以重新定義父類中的方法,這樣就會覆蓋父類的方法,也稱為「重寫」

簡單方法重寫使用

# 測試繼承方法重寫的簡單使用

class person(object):

def __init__(self, name, age):

self.name = name

self.__age = age

def say_age(self):

print("你是:{},年齡:{}".format(self.name, self.__age))

class student(person):

def __init__(self, name, age, score):

person.__init__(self, name, age) # 必須顯示的呼叫父類初始化方法,不然直譯器不會去呼叫

self.score = score

def say_age(self):

"""重寫了父類的方法

:return:

"""print('我是:{},年齡:{}'.format(self.name, self.score))

if __name__ == '__main__':

st = student('張三', 13, 23)

print(dir(st)) # 檢視物件的所有屬性

st.say_age()

重寫__str__()方法object有乙個__str__()方法,用於返回乙個「物件的描述」,對應於內建函式str(),經常用於print()方法,幫助我檢視物件的資訊,__str__可以重寫。

# 重寫object類裡面的__str__方法,此方法是返回乙個對於"物件的描述"

class per: #預設繼承object類

def __init__(self, name):

self.name = name

def __str__(self):

return "物件是:{}".format(self.name)

if __name__ == '__main__':

p = per('張三')

print(p)

執行返回:

不重寫__str__,返回:<__main__.per object at>

重寫__str__,返回:物件是:張三

super()獲得父類定義

在子類中,想要獲得父類的方法時,可以通過super()來做,

super()代表父類的定義,不是父類物件

# 測試super(),代表父類定義,而不是父類的物件

class a:

def say_age(self):

print('你好撒:', self)

class b(a):

def say_age(self):

# a.say_age(self) # 調父類的方法,這種在呼叫單繼承的時候沒有問題,

super().say_age() # 呼叫父類的方法,這種是解決多繼承的問題

print('b是啥:', self)

b().say_age()

多型是指同乙個方法呼叫由於不同可能會產生不同的行為。

關於多型要注意一下兩點:

1.多型是方法的多型,屬性沒有多型

2.多型的存在有2個必要條件:繼承、方法重寫

【例子】

# 多型

class man:

def eat(self):

print('餓了,需要吃飯')

class chinese(man):

def eat(self):

print('中國人開始吃飯,筷子已備好')

class english(man):

def eat(self):

print('英國人開始吃飯,刀叉已備好')

class indian(man):

def eat(self):

print('印度人開始吃飯,自備吧,我也不知道你用啥了')

def maneat(m):

if isinstance(m, man): # m是否是man的子類

m.eat()

else:

print('閒餓著吧,,還沒有開飯')

maneat(chinese())

maneat(english())

maneat(indian())

執行返回

物件導向三大特徵

1.繼承 什麼是繼承 繼承是一種建立新類的方式,在python中,新建的類可以繼承乙個或多個父類,父類又可稱為基類或超類,新建的類稱為派生類或子類 python中類的繼承分為 單繼承和多繼承 class parentclass1 定義父類 pass class parentclass2 定義父類 p...

物件導向三大特徵

是指將物件的狀態資訊隱藏在物件內部,不允許外部程式直接訪問而是通過類提供的方法實現類內資訊的操作和訪問。可以通過j a中的訪問控制符來實現。實現復用。j a中,通過extends實現繼承 每個類只有乙個直接父類 j a.lang.object是所有類的直接 間接父類 子類獲得父類的全部屬性和方法 除...

python物件導向的三大特徵

封裝就是對類和物件的成員訪問進行限制,設定可以訪問的方式和不可以訪問的方式。分類 私有化的封裝 當前類 物件種可以使用,類 物件外和子類 物件都不可以用 受保護的封裝 當前類 物件和子類 子類物件可以使用門,類 物件外不可以使用 公共的封裝 任何位置都可以訪問 例 class father 屬性 男...