。繼承是物件導向的三大特性之一
。通過繼承我們可以使乙個類獲取到其他類中屬性和方法
。在定義類時,可以在類名後面的括號中指定當前類的父類(超類、基類)
。繼承提高了類的復用性,讓類與類之間產生了關係,有了這個關係,才有了多型的特性。
隱患:建立乙個新模擬較麻煩,需要大量的複製貼上**。維護修改起來比較麻煩,因此引入了繼承
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...