物件導向三大特性之一 繼承

2021-09-05 13:04:49 字數 4792 閱讀 8528

3、子類呼叫父類的方法

4、組合重用

繼承指的是類與類之間的關係,繼承的功能之一就是用來解決**重用問題

繼承是一種建立新類的方式,在python中,新建的類可以繼承乙個或多個父類,父類又可以成為基類或超類,新建的類稱為派生類或子類

class people:

pass

class male(people):

pass

print(male.__bases__)

# (,)

__base__只檢視從左到右繼承的第乙個子類,__bases__則是檢視所有繼承的父類,python支援多繼承,用逗號分隔開多個繼承的類

通過繼承的方式建立乙個新的類,會繼承父類的所有屬性,查詢屬性先從例項中找,然後去類中找,然後去父類中找。

子類也可以新增自己新的屬性,或者在子類中重新定義父類中的屬性,在呼叫時以子類為準,這就是派生

為了實現繼承,python會在mro列表上從左到右開始查詢,直到找到第乙個匹配這個屬性的類為止。

class people:

pass

class male(people):

pass

print(male.mro())

[, , ]

python中子類可以同時繼承多個父類,如果繼承了多個父類,那麼屬性的查詢方式有兩種,分別是:深度優先和廣度優先

python3裡統一都是新式類,按照廣度優先的方式查詢

python2中才分經典類和新式類,沒有繼承object類的類以及該類的子類都是經典類,反之為新式類,python3中預設繼承object類,都是新式類。

class people:

pass

print(people.__bases__)

(,)

最後再找最高層類

class a:

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')

f1 = f()

print(f.mro())

# [, ,

# , ,

# , ,

# ]

class a:

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 h(a):

pass

class d(b):

def test(self):

print('from d')

class e(c):

def test(self):

print('from e')

class f(d):

def test(self):

print('from f')

class g(e):

pass

class i(f, h, g):

pass

print(i.mro())

[, , , , , , , , , ]

在子類派生出的新方法中,往往需要重用父類的方法

有兩種方式:

1、父類名.函式名(引數),不依賴繼承,就是普通的父類函式呼叫。

class people:

def __init__(self, name, age, ***):

self.name = name

self.age = age

self.*** = ***

def run(self):

pass

class student(people):

def __init__(self, name, age, ***, grade):

# self.name = name

# self.age = age

# self.*** = ***

people.__init__(self, name, age, ***) # 父類名+函式名

self.grade = grade

def learn(self):

pass

s1 = student('xiaohong', 18, 'male', '3')

print(s1.grade)

2、super()方法

class people:

def __init__(self, name, age, ***):

self.name = name

self.age = age

self.*** = ***

def run(self):

pass

class student(people):

def __init__(self, name, age, ***, grade):

# self.name = name

# self.age = age

# self.*** = ***

# people.__init__(self, name, age, ***) # 父類名+函式名

super().__init__(name, age, ***) # 沒有self引數

self.grade = grade

def learn(self):

pass

s1 = student('xiaohong', 18, 'male', '3')

print(s1.grade)

super是依賴繼承的,即使沒有繼承關係,也會按照mro順序表查詢:

class a:

def test(self):

super().f1()

class b:

def f1(self):

print('from b')

class c(a,b):

pass

c = c()

c.test()

print(c.mro())

結果from b

[, , , ]

組合指的是,在乙個類中以另外乙個類的物件作為資料屬性,稱為類的組合。

組合就是在物件中新增乙個資料屬性,指向另外乙個類的物件。

意思就是把另外乙個類的物件當作一項屬性新增到屬性中。

繼承是一種』是』的關係,老師和學生是人,組合是一種「有」的關係,老師有課程,學生有老師。

當類之間有顯著不同,並且較小的類是較大的類所需要的元件時,用組合比較好

class people:

def __init__(self, name, age, ***):

self.name = name

self.age = age

self.*** = ***

class teacher(people):

def __init__(self, name, age, ***):

people.__init__(self, name, age, ***) # 繼承重用

class student(people):

def __init__(self, name, age, ***):

people.__init__(self, name, age, ***)

class course:

def __init__(self, name, price):

self.name = name

self.price = price

student = student('小明', 18, 'male')

teacher = teacher('老李', 36, 'male')

# 為學生增加課程

python = course('python', '3000')

student.course = python # 組合重用

print(student.course)

# <__main__.course object at 0x000002a1f34c5160>

print(student.course.name)

# python

# 為老師增加學生

teacher.student = student

print(teacher.student)

# <__main__.student object at 0x000001dc13ce50f0>

print(teacher.student.name)

# 小明

物件導向三大特性之一!!!!!!

封裝 繼承 多型。在學習每乙個技術時,記住學習它的案例。多型 父類的引用可以傳入子類的物件。多型的最基本使用方法 父類的引用作為方法的形參。public void tohospital pet pet 父類的引用可以作為方法的返回值型別。2.父類的引用作為方法的返回值型別 public pet ru...

物件導向三大特徵之一 繼承

概述 多個類中存在相同的屬性和行為時,我們可以將這些內容抽取到單獨的乙個類中,那麼多個類就無需在定義這些屬性和行為,只要去繼承這個單獨的類即可。其中,多個類稱為子類或者派生類,單獨的那乙個類稱為父類,超類,基類 繼承描述的是事物之間的所屬關係,這種關係是 is a關係。在繼承關係中,子類就是乙個父類...

物件導向三大特徵之一繼承

繼承 類似於現實世界中的子承父業,實現字段 屬性 方法 構造方法例外 的繼承,但私有的是無法訪問的,將類和類之間進行關聯,增加系統的耦合性,被繼承的類 父類或基類,繼承的類 子類或派生類。重用性 子類繼承父類的非私有的成員 例子 class people public string name pub...