python面向對象之繼承

面向對象之繼承

什么是面向對象的繼承?

繼承(英語:inheritance)是面向對象軟件技術當中的一個概念。如果一個類別A“繼承自”另一個類別B,就把這個A稱

為“B的子類別”,而把B稱為“A的父類別”也可以稱“B是A的超類”。繼承可以使得子類別具有父類別的各種屬性和方法,而

不需要再次編寫相同的代碼。在令子類別繼承父類別的同時,可以重新定義某些屬性,并重寫某些方法,即覆蓋父類別的

原有屬性和方法,使其獲得與父類別不同的功能。另外,為子類別追加新的屬性和方法也是常見的做法。 一般靜態的面向

對象編程語言,繼承屬于靜態的,意即在子類別的行為在編譯期就已經決定,無法在執行期擴充。

class Person:def __init__(self,name,sex,age):self.name =nameself.age = ageself.sex = sex
class Cat:def __init__(self,name,sex,age):self.name = nameself.sex =sexself.age =age
class Dog:def __init__(self,name,age,sex):self.name =nameself.sex =sexself.age = age
# 定義三個不同的類class Animal(object):def __init__(self,name,sex,age):self.name = nameself.sex = sexself.age = age
# 定義一個Animal父類
class Person(Animal):pass
class Dog(Animal):pass
class Person(Animal):pass
# 派生三個子類

繼承的優點:

  • 增加了類的耦合性(耦合性不宜多,宜精)。
  • 減少了重復代碼。
  • 使得代碼更加規范化,合理化。

繼承的分類

父類,又叫基類,超類,上面例子中的Animal就是一個父類。

子類,派生類,由父類派生而成的類,可以調用父類的靜態屬性和動態方法。

繼承:可以分單繼承,多繼承

經典類和新式類:

  • 在python2.2版本之前均為經典類,python2.2之后新式類和經典類并存,python3之后取消了經典類的概念、

  • 簡單來說,在python2x基類的根如果什么也不寫就是經典類,如果python的根為object就為新式類

  • python3x版本中只有一種類:

    python3中使?的都是新式類. 如果基類誰都不繼承. 那這個類會默認繼承 object

單繼承

類名,對象執行父類方法

class Aniaml(object):type_name = '動物類'def __init__(self,name,sex,age):self.name = nameself.age = ageself.sex = sexdef eat(self):print(self)print('吃東西')class Person(Aniaml):passclass Cat(Aniaml):passclass Dog(Aniaml):pass# 類名:
print(Person.type_name)  # 可以調用父類的屬性,方法。
Person.eat(111) 
print(Person.type_name)

執行順序

class Animal(object):    # 1type_name = "動物類"   # 6def __init__(self,name,sex,age):  # 7self.name = name  # 8self.sex = sex   # 9self.age = age   # 10def eat(self):print(self)print("吃東西")
class Person(Animal):    # 2def eat(self):   # 11print("%s 吃飯"%self.name)  # 13
class Cat(Animal):      # 3pass
class Dog(Animal):      # 4pass
p1 = Person("alex","laygirl",34)   # 5
p1.eat()  #  12
# 結果:
alex 吃飯
# 實例化對象時必須執行__init__方法,類中沒有,從父類找,父類沒有,從object類中找。
# 先要執行自己類中的eat方法,自己類沒有才能執行父類中的方法。

同時執行類以及父類中的方法

1.方法一:

如果想執行父類的func方法,這個方法并且子類中也用,那么就在子類的方法中寫上:

父類.func(對象,其他參數)

class Aniaml(object):type_name = '動物類'def __init__(self,name,sex,age):self.name = nameself.age = ageself.sex = sex   # 繼承父類中的三個靜態屬性def eat(self):print('吃東西')class Person(Aniaml):def __init__(self,name,sex,age,mind):Aniaml.__init__(self,name,sex,age)  # 方法一self.mind = mind   # 封裝mind屬性def eat(self):super().eat()print('%s 吃飯'%self.name)
class Cat(Aniaml):passclass Dog(Aniaml):pass
p1 = Person('春哥','laddboy',18,'有思想')
print(p1.__dict__)

2.利用super,super().func(參數)(父類的重構

class Animal:def __init__(self,name,sex,age):self.name = nameself.sex = sexself.age = agedef eat(self):print("動物都需要吃飯")
class Human(Animal):def __init__(self,name,sex,age,hobby):super(Human,self).__init__(name,sex,age)  # 繼承父類中的三個靜態屬性self.hobby = hobbydef eat(self):super().eat()  # 執行父類中的eat方法print(f"{self.name}都需要吃飯")
class Dog(Animal):pass
class Cat(Animal):pass
H1 = Human("小紅","女",18,"看書")
H1.eat()
# 結果:
"動物都需要吃飯"
"小紅都需要吃飯"

單繼承經典練習題:

# 1
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)class Foo(Base):pass
obj = Foo(123)
obj.func1() # 123 運?的是Base中的func1  # 2      
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)
class Foo(Base):def func1(self):print("Foo. func1", self.num)
obj = Foo(123)
obj.func1() # Foo. func1 123 運?的是Foo中的func1       # 3         
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)
class Foo(Base):def func1(self):print("Foo. func1", self.num)
obj = Foo(123)
obj.func1() # Foo. func1 123 運?的是Foo中的func1     
# 4
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print("Base.func2")
class Foo(Base):def func2(self):print("Foo.func2")
obj = Foo(123)
obj.func1() # 123 Foo.func2 func1是Base中的 func2是?類中的 
# 再來
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print(111, self.num)
class Foo(Base):def func2(self):print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:obj.func2() # 111 1 | 111 2 | 222 3# 再來
class Base:def __init__(self, num):self.num = numdef func1(self):print(self.num)self.func2()def func2(self):print(111, self.num)
class Foo(Base):def func2(self):print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:obj.func1() # 那筆來吧. 好好算

多繼承

class A:def __init__(self,name):self.name = namedef show_name(self):print(f"A的名字為{self.name}")
class B:def __init__(self,name):self.name = namedef show_name(self):print(f"B的名字為{self.name}")
class C(A,B): # C同時繼承A,B類pass
c = C("A")
print(c.name)
c.show_name()

在python這種,經典類和新式類繼承父類所使用的算法是完全不同的

經典類的多繼承

經典類的多繼承采用深度優先算法

class A:pass
class B(A):pass
class C(A):pass
class D(B, C):pass
class E:pass
class F(D, E):pass
class G(F, D):pass
class H:pass
class Foo(H, G):pass

1729998-20190807113226947-822370988.jpg

類的: Foo-> H -> G -> F -> E -> D -> B -> A -> C.

新式類的多繼承

mro序列

MRO是一個有序列表L,在類被創建時就計算出來

通用計算公式為:

mro(Chird(Base1,Base2)) = [child] + merge(mro(Base1),mro(Base2),[Base1,Base2])
# 其中child繼承自Base1,Base2

如果繼承一個基類:class B(A)

這時候B的mro序列為

mro(B) = mro(B(A))
= [B] + merge(mro(A) + [A])
= [B] + merge([A] + [A])
= [B,A]

如果繼承至多個基類:class B(A1,A2,A3)

mro(B) = mro( B(A1, A2, A3 …) )
= [B] + merge( mro(A1), mro(A2), mro(A3) ..., [A1, A2, A3] )
= ...

計算結果為列表,列表中至少有一個元素即類自己,如上述示例[A1,A2,A3],merge操作是C3算法的核心

表頭和表尾

表頭:
  列表的第一個元素

表尾:
  列表中表頭以外的元素集合(可以為空)

示例
  列表:[A, B, C]
  表頭是A,表尾是B和C

列表之間的+操作

+操作:

[A] + [B] = [A, B]

(以下的計算中默認省略)

如計算merge( [E,O], [C,E,F,O], [C] )
有三個列表 :  ①      ②          ③
merge不為空,取出第一個列表列表①的表頭E,進行判斷                              各個列表的表尾分別是[O], [E,F,O],E在這些表尾的集合中,因而跳過當前當前列表
取出列表②的表頭C,進行判斷C不在各個列表的集合中,因而將C拿出到merge外,并從所有表頭刪除merge( [E,O], [C,E,F,O], [C]) = [C] + merge( [E,O], [E,F,O] )
進行下一次新的merge操作 ......
---------------------

計算mro(A)方式:

mro(A) = mro( A(B,C) )原式= [A] + merge( mro(B),mro(C),[B,C] )mro(B) = mro( B(D,E) )= [B] + merge( mro(D), mro(E), [D,E] )  # 多繼承= [B] + merge( [D,O] , [E,O] , [D,E] )  # 單繼承mro(D(O))=[D,O]= [B,D] + merge( [O] , [E,O]  ,  [E] )  # 拿出并刪除D= [B,D,E] + merge([O] ,  [O])= [B,D,E,O]mro(C) = mro( C(E,F) )= [C] + merge( mro(E), mro(F), [E,F] )= [C] + merge( [E,O] , [F,O] , [E,F] )= [C,E] + merge( [O] , [F,O]  ,  [F] )  # 跳過O,拿出并刪除= [C,E,F] + merge([O] ,  [O])= [C,E,F,O]原式= [A] + merge( [B,D,E,O], [C,E,F,O], [B,C])= [A,B] + merge( [D,E,O], [C,E,F,O],   [C])= [A,B,D] + merge( [E,O], [C,E,F,O],   [C])  # 跳過E= [A,B,D,C] + merge([E,O],  [E,F,O])= [A,B,D,C,E] + merge([O],    [F,O])  # 跳過O= [A,B,D,C,E,F] + merge([O],    [O])= [A,B,D,C,E,F,O]
---------------------

轉載于:https://www.cnblogs.com/lifangzheng/p/11314321.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247235.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

美國正面臨“人才泡沫”破裂危機?

(Jason Lane和Kevin Kinser/文)最近,與教育有關的種種問題在美國社會引起了廣泛討論。首先巨額的學生貸款問題:根據美聯儲紐約分行在2012年11月發布的一份報告,全美學生貸款總額已經達到420億美元,其中新增…

ngrx學習筆記

什么是ngrx ngrx是Angular基于Rxjs的狀態管理,保存了Redux的核心概念,并使用RxJs擴展的Redux實現。使用Observable來簡化監聽事件和訂閱等操作。 在看這篇文章之前,已經假設你已了解rxjs和redux。 有條件的話請查看官方文檔進行學習理解。 所…

解決RM刪除沒有釋放空間問題

www172-18-8-12 log]$ df -h Filesystem Size Used Avail Use% Mounted on/dev/vda1 120G 101G 20G 84% /devtmpfs 7.8G 0 7.8G 0% /devtmpfs 7.8G 0 7.8G 0% /dev/shmtmpfs 7.8G 601M 7.2G 8% /run 我刪除文件時,直接用的rm 沒有加參數lf,結果空間沒有釋放 文件已經…

.slice(0)

高手代碼里看到.slice(0),查了下這樣寫的好處: 1.對原數組進行深拷貝,這樣進行一系列操作的時候就不影響原數組了; 2.將類數組對象轉化為真正的數組對象:var anchorArray [].slice.call(document.getElementsByTagN…

在線課程學習、科研科技視頻網站

最近在網絡學習課程,發現很多在線課程網站,與大家分享一下。本人新浪博客:http://blog.sina.com.cn/u/1240088994 公開課課程圖譜http://coursegraph.com/navigation/ 1. 網易公開課 http://open.163.com/; 網易TED http://…

對html2canvas的研究

介紹 該腳本允許您直接在用戶瀏覽器上截取網頁或部分網頁的“屏幕截圖”。屏幕截圖基于DOM,因此它可能不是真實表示的100%準確,因為它沒有制作實際的屏幕截圖,而是根據頁面上可用的信息構建屏幕截圖。 這個怎么運作 該腳本遍歷其加…

[Vue warn]: You are using the runtime-only build of Vue 牽扯到Vue runtime-compiler與runtime-only區別

[Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available. Either pre-compile the templates into render functions, or use the compiler-included build. 1. Vue的編譯渲染過程 template --> ast --> render函數 -…

親歷2013年TED大會:全球最潮靈感大會

本文轉自:http://mooc.guokr.com/opinion/436837/ 本文由《外灘畫報》供稿 文/華琪(發自美國) 編輯/吳慧雯 什么是TED的世界?在這里,你可以輕易發現各種名人出沒的痕跡,和各個領域里最具遠見卓識和創造…

Java生鮮電商平臺-電商會員體系系統的架構設計與源碼解析

Java生鮮電商平臺-電商會員體系系統的架構設計與源碼解析 說明:Java生鮮電商平臺中會員體系作為電商平臺的基礎設施,重要性不容忽視。我去年整理過生鮮電商中的會員系統,但是比較粗,現在做一個最好的整理架構. 設計電商會員體系需…

為什么要上大學?

為了讓自己成為更有意思的人。 (文/美國圣母大學哲學教授 Gary Gutting)再不久,千千萬萬的大學生又將走完一個學期。他們中的很多人以及他們的家人,可能為剛剛過去的幾個月或是幾年投入了相當可觀的時間、努力以及金錢…

React AntD 表格查看修改時默認選中幾行數據

hook定義selectedRowKeys const [selectedRowKeys, setSelectedRowKeys] useState([]); const [selectedRowsState, setSelectedRows] useState([]); 初始化時利用setSelectedRowKeys給selectedRowKeys塞值,時行數據的rowKey的數組。 設置table屬性rowSelection <Table…

python面向對象三大特性、類的約束、print帶顏色輸出及super補充

面向對象三大特性、類的約束、print帶顏色輸出及super補充 簡述&#xff1a; python面向對象的三大特性&#xff1a; 1.繼承是一種創建新類的方式&#xff0c;在python中&#xff0c;新建的類可以繼承一個或多個父類&#xff0c;父類又可稱為基類或超類&#xff0c;新建的類稱為…

dayjs也可回顯AntD DatePicker的值

遇到的問題&#xff1a;react 使用AntD 表單里有多個RangePicker,查看修改時要回顯值。 antd的DatePicker需要的是moment對象。但是項目里引的是dayjs庫 解決方式&#xff1a; 方式一:直接多引moment.js庫&#xff0c;字符串轉moment對象 moment(2022-02) 方式二:不甘心引兩…

打造“神犇”是教育的未來嗎?

這年頭&#xff0c;品學兼優、身懷特長的“神犇”&#xff0c;拼的不僅是天賦異稟和后天努力&#xff0c;更是身后爹媽的錢包&#xff0c;而本該實現社會公平的教育&#xff0c;反而加速和凝固了社會的不公。 高等教育的終極目標真的是造就學業超人嗎&#xff1f;《紐約時報》刊…

洛谷 P3243 【[HNOI2015]菜肴制作】

第一眼看到這題&#xff0c;頓時懵逼&#xff0c;一個 \(SB\) 拓撲序竟然是黑題&#xff0c;當場笑噴。 \(Of\) \(course\)&#xff0c;這題我是用堆做的。&#xff08;其實是優先隊列&#xff0c;手寫堆這么垃圾我怎么可能會用呢&#xff09; \((1)\) 首先建圖。如果 \(x\) 需…

AntD 官網樣例 InputRef報錯原因

在官網可編輯表格typescript樣例里 const inputRef useRef<InputRef>(null); InputRef項目報錯原因是ant design的版本問題! antd 4.19版本重寫了input 可通過InputRef來使用input組件的ref

電路原理圖檢查的十大步驟詳解

最近一直在做嵌入式系統&#xff0c;畫原理圖。最后&#xff0c;為了保證原理圖準確無誤&#xff0c;檢查原理圖花費我近兩周的時間&#xff0c;在此&#xff0c;把我在檢查原理圖方面的心得體會總結在此&#xff0c;供大家參考&#xff0c;說得不對的地方歡迎大家指出。 往往我…

亞倫?斯沃茨:怎樣有效利用時間

編者按&#xff1a;今天是著名黑客亞倫?斯沃茨&#xff08;Aaron Swartz&#xff09;頭七的日子。斯沃茨14歲就參與創造RSS 1.0規格的制定&#xff0c;曾在斯坦福大學就讀了一年&#xff0c;是社交新聞網站Reddit的三位創始人之一……斯沃茨自殺時才年僅26歲。這26歲的短暫生命…

AntD 可編輯行表格

本地數據代碼模板自用,官網例子改改 // 編輯行的自定義表格 import React, { useState } from "react"; import {Table,Input,InputNumber,Popconfirm,Form,Typography,Divider, } from "antd";interface Item {key: string;name: string;age: number;add…

SharePoint 2013 - System Features

1. Embed Information & Convert to PDF 功能&#xff0c;在文檔的preview界面&#xff08;hover panel&#xff09;; 2. Share功能可以選擇是否發送郵件 -- Done 4. Shredded Storage, 將文檔的內容和每次的更改分開存儲&#xff0c;每次只存儲更改的內容&#xff0c;而不…