日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

继承的实现原理

發布時間:2025/3/15 编程问答 8 豆豆
生活随笔 收集整理的這篇文章主要介紹了 继承的实现原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.繼承的實現原理

  1.繼承順序

    1.1單獨分叉線路:經典類與新式類依次從左到右,深度優先

    1.2多條重合線路:經典類一路到頭,深度優先;新式類,廣度優先。<參考MRO列表,僅在新式類有>

class A(object):def test(self):print('from A')class B(A):def test(self):print('from B')class C(A):def test(self):print('from C')class D(B):def test(self):print('from D')class E(C):def test(self):print('from E')class F(D,E):# def test(self):# print('from F')pass f1=F() f1.test() print(F.__mro__) #只有新式才有這個屬性可以查看線性列表,經典類沒有這個屬性#新式類繼承順序:F->D->B->E->C->A #經典類繼承順序:F->D->B->A->E->C #python3中統一都是新式類 #pyhon2中才分新式類與經典類 View Code

  2.SUPER方法的應用<使用super調用的所有屬性,都是從MRO列表當前的位置往后找,千萬不要通過看代碼去找繼承關系,一定要看MRO列表>

  子類調用父類的方法:

  super()---->是一個對象,可以查看

方法一:

class Vehicle: #定義交通工具類Country='China'def __init__(self,name,speed,load,power):self.name=nameself.speed=speedself.load=loadself.power=powerdef run(self):print('開動啦...')class Subway(Vehicle): #地鐵def __init__(self,name,speed,load,power,line):Vehicle.__init__(self,name,speed,load,power)self.line=linedef run(self):print('地鐵%s號線歡迎您' %self.line)Vehicle.run(self)line13=Subway('中國地鐵','180m/s','1000人/箱','',13) line13.run() View Code

方法二:

class People:def __init__(self,name,age,sex):self.name=nameself.age=ageself.sex=sexdef foo(self):print('from parent')class Teacher(People):def __init__(self,name,age,sex,salary,level):# People.__init__(self,name,age,sex) #指名道姓地調用People類的__init__函數#在python3中super().__init__(name,age,sex) #調用父類的__init__的功能,實際上用的是綁定方法#在python2中# super(Teacher,self).__init__(name,age,sex)self.salary=salaryself.level=leveldef foo(self):super().foo()print('from child')t=Teacher('egon',18,'male',3000,10) # print(t.name,t.age,t.sex,t.salary,t.level) t.foo() View Code

  3.訪問限制

  如果要讓內部屬性不被外部訪問,可以把屬性的名稱前加上兩個下劃線__,在Python中,實例的變量名如果以__開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問。

具體參考博客:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318650247930b1b21d7d3c64fe38c4b5a80d4469ad7000

?

  4.property的使用

  property裝飾器,把裝飾函數偽裝成一個名詞屬性。

class People:def __init__(self, name, weight, height):self.name = nameself.weight = weightself.height = height# @propertydef bmi(self):return self.weight / (self.height ** 2)f = People('egon', 70, 1.80) f.height=1.82 print(f.bmi()) #不加裝飾器 #如果沒有@property裝飾器的話,調用函數屬性就得f.bmi(),這樣的接口給人一種明顯的執行程序代碼痕跡,而用 #該裝飾器則直接調用f.bmi,更加方便客戶的使用。 # print(f.bmi) #加裝飾器后 View Code

  與裝飾器property連用的setter,deleter.

?

class People:def __init__(self,name,age,sex,height,weight):self.__name=nameself.__age=age #此處都是私有屬性,所以需要開放接口來讓對象查看屬性,因此才會用到相應的裝飾器去修改和刪除屬性。self.__sex=sexself.__height=heightself.__weight=weightdef tell_info(self):print(''' 姓名:%s 年齡:%s 性別:%s 高度:%scm 體重:%skg'''%(self.__name,self.__age,self.__sex,self.__height,self.__weight)) @property def name(self): #被property裝飾器裝飾后,可以直接調用namereturn self.__name@name.setter ##此處的name就是加上property裝飾器后的name,該name.setter裝飾器為了修改屬性.def name(self,value):if not isinstance(value,str):raise TypeError('字符串格式')self.__name=valuereturn self.__name@name.deleter ##此處的name就是加上property裝飾器后的name,該name.deleter裝飾器為了刪除屬性.def name(self):del self.__name@propertydef bmi(self):return self.__weight /(self.__height^2)p1=People('egon',18,'male',170,60) p1.tell_info() print(p1.name) p1.name='hason' #利用name.setter接口修改屬性 del p1.name #利用name.deleter接口刪除屬性 View Code

?

轉載于:https://www.cnblogs.com/junxiansheng/p/7122944.html

總結

以上是生活随笔為你收集整理的继承的实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。