面向對象的三大特性:封裝,繼承,多態程序員
封裝分類: 私有化封裝(只容許在內部訪問)工具
公共的封裝(內外部均可以訪問)spa
受保護的封裝設計
#私有化封裝:只容許在內部訪問
#更名策略的格式爲:_類名__屬性名 _類名方法名__
# class Man:
# name='男人'
# __sex='男'
# def run(self):
# print(self.__sex)
# print('跑起來速度很快')
#
# def __swim(self):
# print('游泳對身體很好喲')
# nr=Man()
# print(nr.__sex) 在外部訪問不了,會報錯
# nr.run() #只能在內部訪問
#利用更名策略來訪問私有化封裝(不容許訪問,這關係到程序員的職業道德素養問題)
# print(nr._Man__sex)
# nr._Man__swim()
# 公共封裝 :內外部都能訪問 (即寫個類就好)
class Man:
name='男人'
sex='男'
def run(self):
print('跑的好快啊')
#受保護的封裝:在繼承中出現,容許內外部訪問,效果和公共的封裝同樣對象
在屬性名/成員方法名前加‘_’便可繼承
class Human:
eye=2
_legs=2
def think(self):
print('人類會思考')
def use(self):
print('人類會使用工具')
class Blace_Man(Human):
pass
berte=Blace_Man()
print(berte._legs)
berte.use()
繼承相關的概念:被繼承的類叫父類/基類/超類
繼承其餘類的類叫作:子類/派生類
繼承的意義:
提升代碼的重用率
創建新的類與類的關係
方便其餘邏輯操做
繼承格式:
class 父類(object):
pass
class 子類(父類):
pass
繼承的特徵:
在不指定父類的狀況下,全部的類均繼承本身的object類(系統提供的)
2.子類繼承父類就是具備父類的全部成員
3.子類繼承父類,不會將父類成員複製到子類當中,子類若是須要成員,能夠找父類索取
4.私有化的成員,容許在子類中單獨創建一份,不會找父類索取似有成員
5.子類能夠根據需求添加本身獨有的成員來進行操做
6.子類重載父類的成員屬性時,僅僅是對子類/對象有效,並不會影響父類
7.子類在重載父類的方法時,也能夠調用父類的方法進行操做
方法一:父類名。父類方法名(參數)----不推薦使用
方法二:super()。父類名()
class Human:
eye=2
__legs=2
def think(self):
print('人類會思考')
def use(self):
print('人類會使用工具')
class Blace_Man(Human):
eye = 3
def think(self):
print('黑人也會思考的')
#調用父類的方法進行操做
# 方法一:父類名.父類方法(隨便寫個參數)不推薦使用
Human.think(1)
#方法二:super().父類方法名() 推薦使用
super().think()
berte=Blace_Man()
# print(Blace_Man.__dict__)
#私有化成員當中,容許在子類中單獨創建一份,不會找父類索取私有成員
# print(berte._Blace_Man__legs) #會報錯
#子類重載父類的成員,僅僅是對子類/對象有效,並不會影響父類
# print(berte.eye)
#子類在重載父類的方法時候,也能夠調用父類的方法進行操做
berte.think()
繼承:
單繼承:一個類只能繼承一個父類的方式
多繼承:一個類能夠繼承多個父類的方式
單繼承:
# class Human:
# eye=2
# def run(self):
# print('人類用兩條腿跑步')
# class Man(Human):
# hair='短髮居多'
# def money(self):
# print('男人會掙錢')
#
# class Child(Man):
# pifu='又白又嫩'
# def ku(self):
# print('哭的聲音很大')
#
# baby=Child()
# print(baby.eye)
# print(baby.hair)
# baby.run()
多繼承:
class Human:
eye=2
def run(self):
print('人類用兩條腿跑步')
class Man():
hair='短髮居多'
def money(self):
print('男人會掙錢')
class Woman():
hair='長髮飄飄'
def work(self):
print('女人也會工做')
class Child(Human,Woman,Man):
pifu='又白又嫩'
def ku(self):
print('哭的聲音很大')
baby=Child()
baby.ku()
baby.work()
print(baby.eye)
print(baby.hair) #是根據繼承類的順序輸出的
多繼承的缺點:菱形bug中某個辦法在繼承中屢次被調用
解決辦法:用super().父類名()
當咱們定義一個菱形時會自動生成一個MRO列表
MRO列表生成原則:1.子類永遠在父類的前面
2.同一等級的類,按照子類中的繼承順序擺放
查看mro列表的方法
print(類名.mro()) 或者 print(類名.__mro__)
super()調用時,不是查找類,實際上super是查找MRO列表上的一個類
super()調用對象時不用傳入對象,自動傳入
class Human():
def think(self):
print('人類會思考')
class Man(Human):
def think(self):
super().think()
print('男人思考如何賺錢')
class Woman(Human):
def think(self):
super().think()
print('女人思考如何讓男人賺錢')
class Child(Man,Woman):
def think(self):
super().think()
print('小孩思考吃喝玩樂')
baby=Child()
baby.think()
print(Child.mro())
issubclass(子類,父類):檢測是不是子類
res=issubclass(Child,Man)
print(res) #TRUE
res=issubclass(Man,Woman)
print(res) #FALSE
res=issubclass(Child,Human)
print(res) #TRUE
多態:
定義:不一樣的子類對象調用相同的父類方法,產生不一樣的執行結果
多態指的是一類事物有多種形態(一個抽象類有多個子類,於是多態的概念依賴於繼承)
多態是調用方法的技巧,不會影響到類的內部設計
關鍵點:繼承,重載
class Human():
def think(self):
print('人類會思考')
class Man(Human):
def think(self):
print('男人思考如何賺錢')
def action(self):
print('男人爲賺錢而努力')
class Woman(Human):
def think(self):
print('女人思考如何變美')
def action(self):
print('女人爲變美去化妝')
class RenYao(Human):
def think(self):
print('人妖思考如何長壽')
def action(self):
print('爲了長壽上臺表演')
man=Man()
woman=Woman()
renyao=RenYao()
#利用多態作一個小實例
list1=[man,woman,renyao]while True: res=input('請輸入指令:1.全體行動 2.全體思考 3.人妖思考,其他人行動 其餘指令退出行動') for name in list1: if res=='1': name.action() elif res=='2': name.think() elif res=='3': if name==renyao: name.think() else: name.action() else: exit()