Python基礎語法之繼承 多型 屬性與方法

2021-10-06 00:11:19 字數 3952 閱讀 3667

。繼承是物件導向的三大特性之一

。通過繼承我們可以使乙個類獲取到其他類中屬性和方法

。在定義類時,可以在類名後面的括號中指定當前類的父類(超類、基類)

。繼承提高了類的復用性,讓類與類之間產生了關係,有了這個關係,才有了多型的特性。

隱患:建立乙個新模擬較麻煩,需要大量的複製貼上**。維護修改起來比較麻煩,因此引入了繼承

class person():

name = ''

age = ''

calss doctor(person):

pass

在建立類時,如果省略了父類,則預設父類為object

object是所有類的父類,所有類都繼承自object

所有物件都是object的例項

class presson(object):

pass

issubclass() 檢查乙個類是否是另乙個類的子類

print(issubclass(person,object)) # true

print(issubclass(int,object)) # true

如果子類中有和父類同名的方法,則通過子類的例項去呼叫方法時,會呼叫子類的方法而不是父類的方法,這個特點我們也稱之為方法的重寫(覆蓋)

當我們用物件去呼叫乙個方法時,

首先會優先當前物件中尋找是否具有該方法,如果有則直接呼叫,如果沒有,則去當前物件的父類中尋找,如果父類中有則呼叫父類中的方法,如果父類中沒有則去父類的父類尋找,以此類推,如果沒有則返回錯誤

class a(object):

def test(self):

print('a....')

class b(a):

def test('b....')

c = b()

print(c.test) # b.....

父類中的所有方法都會被子類繼承,包括特殊方法

有一種動態的方法來獲取類的父類

通過super()可以直接獲取當前類的父類

__bases__可以獲取當前類所有的父類

用法:類名.__bases__

在python中是支援多重繼承的,也就是我們可以為乙個類指定多個父類

如果多個父類中有同名的方法,則會在第乙個父類中尋找,然後找第二個父類。。。。。。前邊會覆蓋後面的

多型是物件導向的三大特性之一

乙個物件可以以不同形態去呈現

class a:

def __init__(self,name):

self._name = name

class b:

def __init__(self,name):

self._name = naem

@property

def name(self):

return self._name

@name.setter

def name(self,name):

self._name = name

class c:

pass

a = a('葫蘆娃')

b = b('鋼鐵俠')

c = c()

#對應speak()這個函式來說,只要物件中函式有name屬性,它就可以作為引數傳遞

#這個函式並不考慮物件的型別,只要有name屬性就可以

def speak(obj):

print('你好 s%'%.obj.name)

speak(a) #你好 葫蘆娃

speak(b) #你好 鋼鐵俠

speak(c) # attributeerror: 'c' object has no attribute 'name'

#在speak2()中做了乙個型別檢查,也就是說只要符合obj是a型別的物件時,才可以執行,其他型別的物件使用不了該函式,這個函式就違反了多型

def speak2(obj):

#檢查obj是否是a的例項

if isinstance(obj,a):

print('你好 %s'%obj.name)

物件導向的三大特徵:

封裝:封裝是確保物件中的資料安全

繼承:保證的物件的可擴充套件性

多型:保證是程式的靈活性

屬性

類屬性,直接在類中定義的屬性是類屬性

類屬性可以通過類或者類的例項進行訪問,但是類屬性只能通過類物件修改,無法通過例項物件修改

例項屬性 通過例項物件新增的屬性輸液例項屬性

例項屬性只能通過例項物件來訪問和修改,類物件無法訪問修改

class a(object):

count = 0

def __init__(self):

self.name = '葫蘆娃'

a = a()

#類屬性可以通過類或者類的例項進行訪問

print a.count #0

print a.count #0

a.count = 10

print('a',a.count) #0

print('a',a.count) #10

#類屬性只能通過類物件修改,無法通過例項物件修改

a.count = 100

print('a',a.count) #100

print('a',a.count) #100

print('a',a.name) #葫蘆娃

print('a',a.name) #atrributeerror :type object 'a' has not attribute 'name'

方法在類中定義,以self為第乙個引數的方法都是例項方法

實施方法在呼叫時,python會將呼叫物件以self傳入

例項方法可以通過類例項和類去呼叫

當通過例項呼叫時,會自動將當前呼叫物件作為self傳入

當通過類呼叫時,不會自動傳遞self,我們必須手動傳遞self

類方法在類的內容以@classmethon來修飾的方法屬性類方法

類方法第乙個引數是cls也會自動被傳遞,cls就是當做類物件

類方法和例項方法的區別,例項方法的第乙個引數self

@staticmethod 修飾的方法是靜態方法

靜態方法不需要指定任何預設引數,靜態方法可以通過類或者例項呼叫

靜態方法基本上是乙個和當前類無關的方法,他只是乙個儲存到當前類的函式

靜態方法一般都是一些工具方法,和當前類無關

class a(object):

def test(self):

print('這是test方法。。。。。')

@classmethod

def test2(cls):

print(' 這是test2方法。。。。。')

@staticmethod

def test3():

print('test3方法是靜態方法')

a = a()

#當通過例項呼叫時,會自動將當前呼叫物件作為self傳入

a.test() #這是test方法。。。。。

#當通過類呼叫時,不會自動傳遞self,我們必須手動傳遞self

a.test() #typeerror : test() missing 1 required postitiaonal argument::'self'

#,我們必須手動傳遞self 需要手工傳遞引數

a.test(a) #這是test方法。。。。。

a.test() 等價於 a.test(a)

#類方法和例項方法的區別,例項方法的第乙個引數self

a.test2() #這是test2方法。。。。。

a.test2() 等價於 a.test2()

a.test3() #test3方法是靜態方法

a.test3() #test3方法是靜態方法

OC基礎語法之封裝繼承多型

封裝 隱藏內部實現,穩定外部介面.封裝就是定義類 定義屬性 定義方法 set方法 提供乙個方法給外界設定成員變數的值,沒有返回值,一定要接收乙個引數,引數型別跟成員變數型別一樣,形參的名稱不能跟成員變數名一樣。get方法 返回物件內部的成員變數,肯定有返回值,返回值與成員變數型別一致,方法名跟成員變...

C 基礎語法 封裝 繼承和多型

封裝 隱藏物件的屬性和實現細節,僅對外提供公共訪問方式。封裝的好處 隱藏類的實現細節 讓使用者只能通過程式設計師規定的方法來訪問資料.繼承機制是物件導向程式設計使 可以復用的最重要的手段,它允許程式設計師在保持原有的特性基礎上進行擴充套件,增加功能,這樣產生新的類,稱作是派生類。繼承呈現了物件導向程...

python學習之繼承和多型

home miao python python3 coding utf 8 這是關於繼承和多型 class parent object def init self,name,age self.name name self.age age defget name self print self.nam...