python面向对象三大基本特性_python面向对象之三大特性
繼承
先看個簡單的例子了解一下繼承。
class Animal: #父類
def __init__(self, name, age, department):
self.name=name
self.age=age
self.department=departmentdefrunning(self):print(‘%s可以奔跑!‘%self.name)class Cat(Animal): #括號里放要繼承的父類
def __init__(self, name, age, department, tail):
Animal.__init__(self, name, age, department) #即想使用父類的屬性又有自己獨有的屬性,就在內部調用父類的__init__
self.tail = tail #派生屬性
classMouse(Animal):def __init__(self, name, age, department, tail):
super().__init__(name, age, department)#super方法只在python3中有 相當于Animal.__init__(self, name, age, department)
self.tail =tailclassHuman(Animal):def __init__(self, name, age, department):
Animal.__init__(self, name, age, department)def create(self): #派生方法
print(‘%s可以創造!‘%self.name)
cat= Cat(‘Tom‘, 10, ‘貓科‘, ‘藍色尾巴‘)
mouse= Mouse(‘Jerry‘, 7, ‘鼠科‘, ‘灰色尾巴‘)
human= Human(‘zzy‘, 24, ‘人科‘)print(cat.name) #Tom
print(mouse.tail) #灰色尾巴
cat.running() #Tom可以奔跑!
human.create() #zzy可以創造!
print(Human.mro()) #[, , ]查看繼承順序
print(Human.__bases__) #查看繼承的所有父類
繼承
通過上面的例子總結一下繼承的特性:
"""繼承:子類是父類的關系 作用:可以減少代碼的重復
通過 類名(父類名) 來進行繼承,
一個類可以單繼承也可以多繼承
一個類可以被單個類繼承,也可以被多個類繼承
父類中沒有而子類中有的屬性為 派生屬性
父類中沒有而子類中有的方法為 派生方法
單繼承:
對象調用時,先在子類里找,子類里有一定用子類里的,沒有再去父類里面找
多繼承:
在新式類中(python3中都是新式類),對象調用查找是按廣度查找
新式類,默認繼承object
在經典類中,對象調用查找是深度查找
經典類,python2.7創建的默認類,繼承object后變為新式類"""
研究一下繼承的查找順序:這里以python3為例
classD:deffunc(self):print(‘d‘)classC(D):deffunc(self):print(‘c‘)classB(D):deffunc(self):print(‘b‘)classA(B, C):deffunc(self):print(‘a‘)
a=A()
a.func()#a A類里有就找A類
#注釋掉A類里的func
a.func() #b A類里沒有,先從括號中最左邊的B類里找
#注釋掉B類里的func
a.func() #c B類里沒有,判斷通過C類也能找到B的父類D,會從C類先找
#注釋掉C類里的func
a.func() #d C類里沒有,就找父類D
上面的繼承順序可以看出:
"""廣度查找:原則就是在沒找到時,按繼承層級找完每一個父類
深度查找:原則是一條繼承線路找到底才會找另外的線路"""
再看下super方法的本質:
classA(object):deffunc(self):print(‘A‘)classB(A):deffunc(self):
super().func()print(‘B‘)classC(A):deffunc(self):
super().func()print(‘C‘)classD(B, C):deffunc(self):
super().func()print(‘D‘)
b=D()
b.func()#打印順序為 A C B D#super的本質 :不是單純找父類 而是根據調用者的節點位置的廣度優先順序來的
封裝
封裝 用于對代碼的保護,使類中的隱藏屬性和方法只有通過提供的公共訪問方式來使用,而不能直接查。
下面寫個例子具體看下:
classPerson:__keys = ‘量子編碼規則‘ #私有靜態屬性
def __init__(self, name, password):
self.name=name
self.__password = password #__屬性 定義私有屬性
def __get_password(self): #__方法 定義私有方法
return self.__password #只能在內部訪問
def login(self, name, passwd): #提供公共訪問方法
if name == self.name and passwd == self.__get_password():print(‘登陸成功‘)
person= Person(‘zzy‘, ‘zzy123‘)#print(person.__password) # 報錯 顯示Person類找不到__password#print(person._Person__password) # zzy123 在外部通過 _類名__屬性名 也能查看私用屬性,但是不能這樣用!
person.login(‘zzy‘, ‘zzy123‘) #登陸成功
那子類能否繼承父類的私有屬性呢?
classFoo:__key = 123
classSon(Foo):print(Foo.__key) #報錯 子類不能繼承父類的私用屬性
多態
"""多態:指一類事物有多種形態,python天生支持多態。
python中推崇鴨子類型,即看起來用起來都很像,但卻沒有任何約束關系,是一種自我約束行為。比如list和tuple
優點:松耦合,相似類之間不會有任何影響
缺點:自我約束,隨意性太強"""
例子
classHoly:defcure(self, HP):
HP+= 100
return ‘血量為%s‘%HPclassDiscipline:defcure(self, HP):
HP+= 100
return ‘血量為%s‘%HPdef cure(obj, HP): #在強數據類型語言中,obj必須要指定數據類型,在Python中就可以是多種形態的
returnobj.cure(HP)#這里的Discipline類和Holy類就很相似,就可以當同一個事物去使用
holy =Holy()
discipline=Discipline()print(cure(holy, 20))print(cure(discipline, 10))
總結
以上是生活随笔為你收集整理的python面向对象三大基本特性_python面向对象之三大特性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信支付之退款步骤详解
- 下一篇: python怎么调用列表_Python中