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

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