self:
1.只是一個(gè)參數(shù)。
2.在對(duì)象使用方法的時(shí)候,當(dāng)前對(duì)象會(huì)作為第一個(gè)參數(shù)的實(shí)參傳入
3.self相當(dāng)于語(yǔ)言中的代詞,表示當(dāng)前對(duì)象本身(其他語(yǔ)言中也有使用this)
4.self的作用連接整個(gè)對(duì)象的所有信息。橋梁的作用!
5.self不是關(guān)鍵字,只是一個(gè)參數(shù)變量名而已,可以使用其他單詞代替(禁止代替)
6.方法的初步分類:
方法中具有接受對(duì)象的參數(shù)這個(gè)方法,叫做非綁定類的方法
方法中沒有接受對(duì)象的參數(shù)這個(gè)方法,叫做綁定類的方法:即 將def func(self)中的self 去掉,在用對(duì)象進(jìn)行訪問時(shí)因?yàn)闆]有self 接受對(duì)象參數(shù),所以不能用對(duì)象訪問,只能通過類去訪問,類和成員方法綁定了.
class Human():
name=“林曉迪”
tall=“180”
def love(self):
print(self.name,“喜歡漂亮的花姑娘”)
def make(self):
self.love()
print(“愛做飯”)
def made():
print(“會(huì)做人”)
man=Human()
man.love()
man.make()
man.made() 類和成員方法被綁定,不能使用對(duì)象訪問
Human.made()
結(jié)果:
林曉迪 喜歡漂亮的花姑娘
林曉迪 喜歡漂亮的花姑娘
愛做飯
面向?qū)ο蟮娜筇卣鳎?
封裝,繼承與多態(tài)
封裝特征:
實(shí)際工作中很多的成員不方便為對(duì)象之外的訪問或者操作的,所以需要限定以下是否可以操作成員。
封裝特性就是對(duì)于成員操作進(jìn)行限制的保護(hù)性措施!
封裝方法:__屬性 __方法
面向?qū)ο蟮姆庋b分為三個(gè)級(jí)別:
私有化封裝 private
受保護(hù)的封裝 protected(在繼承中講解)
公共的封裝 public
對(duì)象/類成員的訪問:
1.當(dāng)前類/對(duì)象內(nèi)部訪問 (在類的結(jié)構(gòu)內(nèi)部)
2.類和對(duì)象的外部訪問 (在類的結(jié)構(gòu)外部)
3.類和對(duì)象的子類/子對(duì)象的訪問(在類的結(jié)構(gòu)外部,在子類/對(duì)象的內(nèi)部)
公共的封裝:
方法: 任何成員在沒有進(jìn)行私有化操作的時(shí)候默認(rèn)都是公共的封裝。
特征: 公共的封裝成員屬性和方法,在任何位置都可以被訪問。
一般我們寫的class都是公共封裝
class FengZhuang:
sex = “機(jī)器人”
name = “人工智能”
# 成員方法
def feng(self):
print(“封印起來(lái)”)
fz = FengZhuang()
受保護(hù)的封裝:(警示禁止使用效果,但不具備阻止訪問的能力)
內(nèi)部訪問:名稱前加_單下劃線即可
class Human():
name = “馬云”
_money = 100000000
def made(self):
print(“每天忙著賺錢,養(yǎng)家,大佬您辛苦了~”)
class Man(Human):
name = “張文廣”
def _make(self):
self.made()
print(“拿到{}錢了,每天吃喝玩樂”.format(self._money))
wenguang = Man()
wenguang._make() #都可以訪問
print(wenguang._money)
私有化封裝:
方法:在成員屬性或者方法名稱之前,添加雙下劃線,就可以私有化成員。
特征:私有化的成員屬性和方法,無(wú)法在類/對(duì)象的外部訪問;私有化成員僅允許在類/對(duì)象的內(nèi)部訪問
class Human():
name = “人類”
__girlfriend = “女朋友”
def move(self):
print(self.__girlfriend)
self.__love()
print(“人類使用交通工具”)
def __love(self):
print(“開心的造人”)
wenguang = Human()
wenguang.move() #通過內(nèi)部可訪問_love(self)的成員方法
print(wenguang.__girlfriend) 無(wú)法輸出報(bào)錯(cuò)
print(Human.girlfriend) 無(wú)法輸出報(bào)錯(cuò)
python封裝秘密(并沒有實(shí)現(xiàn)真正的私有化!):(了解,但是不允許使用)
其實(shí)python沒由實(shí)現(xiàn)和其他語(yǔ)言一樣的面向?qū)ο蠓庋b策略(還不是很完備)
私有化封裝采用了name mangling(改名) 的策略實(shí)現(xiàn)的私有化操作。并不是真正的私有化!
改名策略:將原有成員屬性或者方法名 修改為 _類名__成員名
訪問使用對(duì)象._類名__成員名即可
class Human():
name = “人類”
__girlfriend = “女朋友”
def move(self):
print(self.__girlfriend)
self.__love()
print(“人類使用交通工具”)
def __love(self):
print(“開心的造人”)
wenguang = Human()
print(wenguang._Human__girlfriend)
wenguang._Human__love()
繼承
繼承父母的愿望,繼承父母的財(cái)產(chǎn),繼承支付寶。。。
計(jì)算機(jī)中繼承:
面向?qū)ο笾械睦^承就表示一個(gè)類獲取另外一個(gè)類的成員的操作。(并非所有成員)
繼承相關(guān)的概念:
被其他類繼承的類,這個(gè)類叫做父類,也叫做基類或者超類
繼承其他類的類,這個(gè)類叫做子類,也叫做派生類
繼承的意義:
提高代碼的重用率,建立新的類與類的關(guān)系,方便其他邏輯操作。
繼承的特征:
1.在不指定父類的情況下,所有的類均繼承自object類(系統(tǒng)提供的)
2.子類繼承父類就具有父類的所有成員。
3.子類繼承父類,不會(huì)將父類成員復(fù)制到子類中,子類如果需要成員,可以找父類索?。?
4.私有化的成員,允許在子類中單獨(dú)建立一份,不會(huì)找父類索取私有成員
5.子類可以根據(jù)需求添加自己獨(dú)有的成員來(lái)進(jìn)行操作。
6.子類重載父類的成員。僅僅是對(duì)子類/對(duì)象有效。并不會(huì)影響父類
7.子類在重載父類的方法的時(shí)候,也可以調(diào)用父類的方法來(lái)進(jìn)行操作:
父類名.父類方法名(參數(shù)) -> 任何方式都允許
super().父類方法名() -> 必須是帶有self的對(duì)象方法才可以使用
class Father(object):
__name = “父親”
sex = “男”
money = “1個(gè)億”
def sell(self):
print("賣包包")
def __love(self):
print("爸爸和媽媽的愛情結(jié)晶")
class Son(Father):
name = “兒子”
def sell(self):
super().sell() #Father.sell(1)
print("賣表")
def love(self):
print("兒子喜歡年輕漂亮的小姐姐")
son = Son()
print(Son.
dict
) #Son的類信息內(nèi)沒有父類的信息
print(son.sex)
son.sell()
son.love()
單繼承與多繼承?
單繼承:一個(gè)類只能繼承一個(gè)父類的方式。 多繼承:一個(gè)類可以繼承多個(gè)父類的方式。
單繼承:(生物角度) 人類->哺乳類動(dòng)物->動(dòng)物->生物->有機(jī)物…
多繼承:(社會(huì)角度)
舞蹈老師(教舞蹈) 體育老師(運(yùn)動(dòng)) 爸爸(帥氣) 媽媽(打掃衛(wèi)生)
我(舞蹈,運(yùn)動(dòng),帥氣,打掃衛(wèi)生)
單繼承案例:
血緣關(guān)系
class GrandFather():
money = 10000000
class Father(GrandFather):
money = 1000
face = “帥氣的一張臉”
class Me(Father):
pass
myself = Me()
print(myself.money)
print(myself.face)
多繼承案例:
多繼承帶來(lái)的BUG-菱形繼承
class Human():
def say(self):
print(“人類向天怒吼:人定勝天!”)
class Man(Human):
def say(self):
super().say() #改為Human.say(1)
print(“男人向天怒吼:女孩的心思我不懂~”)
class WoMan(Human):
def say(self):
super().say() #改為Human.say(1)
print(“女人向天怒吼:男人你們能不能別猜我心思了”)
class Child(Man,WoMan):
def say(self):
super().say() #改為Woman.say(1),Man.say(0)
print(“小孩向天怒吼:哇哇哇~”)
child = Child()
child.say()
print(Child.mro())
結(jié)果為
人類向天怒吼:人定勝天!
女人向天怒吼:男人你們能不能別猜我心思了
男人向天怒吼:女孩的心思我不懂~
小孩向天怒吼:哇哇哇~
若修改結(jié)果為
人類向天怒吼:人定勝天!
人類向天怒吼:人定勝天!
女人向天怒吼:男人你們能不能別猜我心思了
男人向天怒吼:女孩的心思我不懂~
小孩向天怒吼:哇哇哇~
菱形bug:如果這里super().say()改為向父類調(diào)用,就會(huì)導(dǎo)致某個(gè)方法在繼承中被多次調(diào)用!
菱形繼承的bug解決:MRO列表和super 類
解決辦法:將菱形繼承改變成類似于單繼承的方式
當(dāng)我們定義一個(gè)菱形繼承關(guān)系的時(shí)候,程序會(huì)自動(dòng)生成一個(gè)新的MRO列表。
MRO列表: Method Realtion Order 方法關(guān)系列表。
MRO列表的生成的原則:1.子類永遠(yuǎn)在父類的前面 2.同一等級(jí)的類,按照子類中的繼承順序擺放
super()調(diào)用的時(shí)候,不是查找父類, 實(shí)際上super是查找MRO列表的上一個(gè)類
super()調(diào)用對(duì)象方法的時(shí)候不需要傳入對(duì)象,自動(dòng)傳入
如果需要查看mro列表,可以使用類名.mro() 方法 或用類名.
mro
查看
多態(tài)
定義:不同的子類對(duì)象調(diào)用相同的父類方法,產(chǎn)生不同的執(zhí)行結(jié)果
多態(tài)指的是一類事物有多種形態(tài),(一個(gè)抽象類有多個(gè)子類,因而多態(tài)的概念依賴于繼承)
多態(tài)是調(diào)用方法的技巧,不會(huì)影響到類的內(nèi)部設(shè)計(jì)
關(guān)鍵點(diǎn):繼承 改寫(重載)
定義狗類
class Dog:
def work(self):
print(“狗是人類的好朋友”)
定義警犬類
class ArmyDog(Dog):
def work(self):
print(‘追擊敵人’)
定義緝毒犬類
class DrugDog(Dog):
def work(self):
print(‘追查毒品’)
定義二哈類
class HaDog(Dog):
def work(self):
print(“歡樂的破壞”)
#定義人類
class Person:
def with_dog(self, dog): # 只要能接收父類對(duì)象,就能接收子類對(duì)象
dog.work() # 只要父類對(duì)象能工作,子類對(duì)象就能工作。并且不同子類會(huì)產(chǎn)生不同的執(zhí)行效果。
p = Person()
p.with_dog(ArmyDog())
p.with_dog(DrugDog())
p.with_dog(HaDog())
面向?qū)ο蟪S煤瘮?shù)
issubclass()
作用:檢測(cè)一個(gè)類是否是另一個(gè)類的子類
格式:issubclass(子類,父類)
返回值:布爾值
注意事項(xiàng):只要存在于繼承關(guān)系中 就成立
class Father():
pass
class Son(Father):
pass
res = issubclass(Son,Father)
print(res)
isinstance()
作用:檢測(cè)一個(gè)對(duì)象是否是指定類的實(shí)例
格式:isinstance(對(duì)象,類)
返回值:布爾值
res = isinstance([1,2,3,4,5],tuple)
print(res)
class Son():
pass
wsc = Son()
res = isinstance(wsc,Son)
print(res)
hasattr()
作用:檢測(cè)類/對(duì)象是否包含指定名稱的成員
格式:hasattr(對(duì)象,‘成員名稱’)
返回值:布爾值
注意:可以檢測(cè)類也可以檢測(cè)對(duì)象,只要可以訪問就算存在
class ShengWu:
life = “活著”
class Human(ShengWu):
name = “hello”
def move(self):
print(“yidong”)
wenguang = Human()
res = hasattr(wenguang,“l(fā)ife”)
print(res)
getattr()
作用:獲取類.對(duì)象的成員值
格式:getattr(對(duì)象,‘成員名稱’,默認(rèn)值)
返回值:不確定
class ShengWu:
life = “活著”
class Human(ShengWu):
name = “hello”
def move(self):
print(“yidong”)
wenguang = Human()
res = getattr(wenguang,“l(fā)i”,“nihao”)
print(res)
setattr()
作用:設(shè)置類/對(duì)象的成員屬性值
格式:setattr(對(duì)象,‘成員名稱’,設(shè)置的值)
返回值:無(wú)
class Human():
__name = “hello”
def move(self):
print(“yidong”)
wenguang = Human()
print(wenguang.
dict
)
setattr(wenguang,“name”,“alice”)
print(wenguang.
dict
)
setattr(wenguang,“name”,“tommy”)
print(wenguang.
dict
)
delattr()
作用:刪除類/對(duì)象的成員
格式:delattr(對(duì)象,‘成員名稱’)
返回值:無(wú)
print(Human.
dict
)
delattr(Human,“name”)
print(Human.
dict
)
dir()
作用:獲取對(duì)象可以訪問的所有成員的列表
格式:dir(對(duì)象)
返回值:對(duì)象可以訪問的所有成員的列表
print(dir(wenguang))
結(jié)果為:
{‘
module
’: ‘
main
’, ‘_Human__name’: ‘hello’, ‘move’:
property() 后面講
作用:設(shè)置描述符操作的函數(shù)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
