日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

python基礎之面向對象的三大特征(15)

系統 1701 0

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’: , ‘ dict ’: dict’ of ‘Human’ objects>, ‘ weakref ’: weakref’ of ‘Human’ objects>, ‘ doc ’: None}

property() 后面講
作用:設置描述符操作的函數


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 谢通门县| 乌苏市| 罗山县| 福海县| 辽宁省| 扎兰屯市| 罗源县| 滨州市| 邵东县| 平阴县| 阳新县| 玛纳斯县| 肃北| 峨边| 昭通市| 三明市| 神农架林区| 邵阳县| 离岛区| 新巴尔虎右旗| 新竹市| 房产| 荔浦县| 武宣县| 常宁市| 天全县| 山东| 肥东县| 平果县| 上思县| 东平县| 郁南县| 平南县| 新野县| 崇左市| 抚远县| 绥滨县| 中超| 九龙城区| 错那县| 临湘市|