物件導向--下
一、繼承的簡介
class Doctor():
def study(self):
print('救死扶傷')
class Soldier():
def study(self):
print('保衛國家')
class Person():
name = ''
age = ''
如何將以上三個類聯絡起來,我們引入繼承的概念。
二、繼承的引入
- 繼承是物件導向的三大特性之一。
- 通過繼承我們可以從一個類回去其他類中的屬性方法。
- 在定義類時,可以在類名後面的括號裡指定當前類的父類(超類、基類)。
- 繼承提高了類的複用性,讓類與類之間產生了關係。有了這個關係,才有了多型的特性。
繼承的演示示例1:
class Animal(object):
def sleep(self):
print('動物會睡覺')
def run(self):
print('動物會跑')
# 定義一個狗類:
# 1.在動物類上面進行修改,新增狗的特性:這樣修改起來不比較麻煩,違反了OCP原則。
# 2.建立一個新的狗類:建立比較麻煩。會出現程式碼的重複。
class Dog(Animal):
def sleep(self):
print('狗會睡覺')
def run(self):
print('狗會跑')
def speak(self):
print('汪汪汪')
# 思路三:直接從animal類中繼承他的屬性與方法。
# class Dog(Animal):
# pass
dog = Dog()
dog.run()
dog.sleep()
列印輸出結果:
動物會跑
動物會睡覺
繼承的演示示例2:
class Animal(object):
def sleep(self):
print('動物會睡覺')
def run(self):
print('動物會跑')
# 定義一個狗類:
# 1.在動物類上面進行修改,新增狗的特性:這樣修改起來不比較麻煩,違反了OCP原則。
# 2.建立一個新的狗類:建立比較麻煩。會出現程式碼的重複。
# 思路三:直接從animal類中繼承他的屬性與方法。
class Dog(Animal):
pass
dog = Dog()
dog.run()
dog.sleep()
列印輸出結果:
動物會跑
動物會睡覺
總結:如果父類與子類中有相同的方法,那麼呼叫就會先呼叫子類的方法,子類沒有在呼叫父類的方法。都沒有就報錯。
三、方法的重寫
- 方法的重寫:如果在子類和父類中有同名的方法,則通過子類例項去呼叫方法時,會呼叫子類方法而不是父類方法,這個特點我們稱之為方法的重寫(覆蓋)。
例項演示:
class Yi(object):
def test(self):
print('這是第Yi個類')
class Er(Yi):
def test(self):
print('這是第Er個類')
class San(Er):
def test(self):
print('這是第San個類')
er = Er()
er.test()
列印輸出結果:
這是第Er個類
- 總結:
- 1.當我們呼叫一個物件的方法時,會先優先去當前物件中尋找是否具有該方法,如果有則直接呼叫,
- 2.如果沒有,則去當前物件的父類中尋找,如果父類中有則直接呼叫父類中的方法。
- 3.如果沒有,則去父類中的父類去尋找,以此類推,知道找到object,如果還是沒有則直接報錯。
四、super()方法
- super方法的作用:可以讓我們重寫父類的方法後,再去呼叫原有的父類的方法。
示例演示:
無引數
class Animal(object):
name = '動物'
def sleep(self):
print('動物會睡覺')
def run(self):
print('動物會跑')
class Dog(Animal):
def sleep(self):
print('狗會睡覺')
# Animal.sleep(self)
super(Dog, self).sleep() # python 2的寫法
super().sleep() # python 3的寫法
def run(self):
print('狗會跑')
def speak(self):
print('汪汪汪')
dog = Dog()
dog.sleep()
列印輸出結果:
狗會睡覺
動物會睡覺
動物會睡覺
總結:
使用方法分為兩種,分別是python2寫法、python3寫法
super(Dog, self).sleep() ----python2寫法不建議使用
super().sleep() ----python3寫法
演示例項2:
有引數
# 有引數init方法(必須瞭解)
class Animal(object):
# init方法必須傳入引數
def __init__(self, name, age):
self.name = name
self.age = age
print('動物')
def sleep(self):
print('動物會睡覺')
def run(self):
print('動物會跑')
class Dog(Animal):
# 方法的重寫:
# init父類傳入引數的同時,子類中init方法也需要傳入引數
# 重點理解
def __init__(self, name, age):
self.name = name
self.age = age
# 在init方法中傳入引數的同時,super方法也許要傳入引數。(二者同時使用時!)
super().__init__(self.name, self.age)
print('狗')
def sleep(self):
print('狗會睡覺')
# Animal.sleep(self)
# super(Dog, self).sleep(self.name, self.age) # python 2的寫法
super().sleep() # python 3的寫法
def run(self):
print('狗會跑')
def speak(self):
print('汪汪汪')
dog = Dog('貓', 10)
# dog.sleep()
列印輸出結果:
動物
狗
五、多重繼承
- 在python中時支援多重繼承的,也是我們可以為一個類同時指定多個父類。
- 可以在類名的括號內部新增多個父類,來實現多重繼承。
- 多重繼承,會使子類同時擁有多個父類,並且會回去所喲有父類的方法。
- 在開發中沒有特殊情況,應該儘量避免適應多重繼承,因為多重繼承會使我們的程式碼更加的複雜。
- 如果多個父類有同名的辦法,則會在第一個父類中尋找,然後時第二個、第三個。前面的會覆蓋後面的。
# 演示示例1:
class A(object):
def text(self):
print('這是A類')
class B(object):
def test(self):
print('這是B類')
class C(A, B):
pass
c = C()
c.test()
# 演示示例2:
class A(object):
def text(self):
print('這是A類')
class B(object):
def test(self):
print('這是B類')
class C(A, B):
pass
c = C()
c.text()
# 演示示例3:
class A(object):
def text(self):
print('這是A類')
class B(object):
def test(self):
print('這是B類')
class C(A, B):
pass
c = C()
c.text()
c.test()
# 演示示例4:
class A(object):
def test(self):
print('這是A類')
class B(object):
def test(self):
print('這是B類')
class C(A, B):
pass
c = C()
c.test()
# 獲取C所有父類的方法
print(C.__bases__)
# 列印輸出結果:(<class '__main__.A'>, <class '__main__.B'>)
上述程式碼為多重繼承的一些相關例項。
列印輸出結果:
這是B類
這是A類
這是A類
這是B類
這是A類
(<class ‘main.A’>, <class ‘main.B’>)
擴充:解耦合
- 提高問題的解決概率。
- 提高問題的解決效果。
- 提高解決問題的解決辦法。
- 降低將來爆發隱患的可能性。
六、多型
- 多型是物件導向的三大特性之一。
- 多型的概念:一個物件可以以不同的形態去展示。
- 多型的有特點:
- 1、只關心物件的例項方法是否同名,不關心物件的所屬型別。
- 2、物件所屬類之間,繼承關係可有可無。
- 3、多型的好處是可以增加程式碼外部呼叫靈活度,讓程式碼更加通用,相容性比較強。
- 4、多型是態哦用方法的技巧,不會影響到類的內部設計。
演示例項:
class A(object):
def __init__(self, name):
self._name = name
# property裝飾器(封裝、檢視屬性)
@property
def name(self):
return self._name
@name.setter # 封裝修改屬性
def name(self, name):
self._name = name
class B(object):
def __init__(self, name):
self._name = name
# property裝飾器(封裝、檢視屬性)
@property
def name(self):
return self._name
@name.setter # 封裝修改屬性
def name(self, name):
self._name = name
# 新增屬性並對屬性進行賦值
a = A('劉亦菲')
b = B('周慧敏')
# 外部定義函式,與類相互使用
def speak(obj):
print('大家好,我是%s' % obj.name)
# 呼叫函式
speak(a)
speak(b)
列印輸出結果:
大家好,我是劉亦菲
大家好,我是周慧敏
總結:
具有不同的功能的函式可以使用相同的函式名,呼叫不同的內容出來。
特性:
類與函式結合使用,產生不同的結果。
無繼承關係例項演示:
class Duck(object):
def fly(self):
print('鴨子沿著水面飛起來了')
class Swan(object):
def fly(self):
print('天鵝在天空中翱翔')
class Plane(object):
def fly(self):
print('飛機在天空做著眼鏡蛇機動')
def fly(obj):
obj.fly()
duck = Duck()
fly(duck)
swan = Swan()
fly(swan)
plane = Plane()
fly(plane)
列印輸出結果:
鴨子沿著水面飛起來了
天鵝在天空中翱翔
飛機在天空做著眼鏡蛇機動
有繼承關係例項演示:
class Grandpa(object):
def __init__(self, money):
self.money = money
def p(self):
print('這是爺爺')
class Father(Grandpa):
def __init__(self, money, job):
super().__init__(money)
self.job = job
def p(self):
print('這是父親,我重寫了爺爺的方法')
class Mother(Grandpa):
def __init__(self, money, job):
super().__init__(money)
self.job = job
def p(self):
print('這是母親,我重寫了爺爺的方法')
def fn(obj):
obj.p()
grandpa = Grandpa(5000)
father = Father(4000, '教授')
mother = Mother(3500, '博士後')
fn(grandpa)
fn(father)
fn(mother)
列印輸出結果:
這是爺爺
這是父親,我重寫了爺爺的方法
這是母親,我重寫了爺爺的方法
有繼承關係程式碼不全,請諒解!
相關文章
- 物件導向(下)物件
- python物件導向(下)Python物件
- 物件導向-物件導向思想物件
- 程式導向與物件導向物件
- 物件導向與程式導向物件
- “程序導向”和“物件導向”物件
- 解釋下什麼是物件導向?物件導向和麵向過程的區別?物件
- 物件導向物件
- 物件導向,搞定物件物件
- PHP 物件導向 (九)物件導向三大特徵PHP物件特徵
- JAVA物件導向基礎--物件導向介紹Java物件
- 從程式導向到物件導向物件
- 5-Java物件導向-繼承(下)Java物件繼承
- 物件導向 -- 反射物件反射
- PHP物件導向PHP物件
- Java — 物件導向Java物件
- JavaScript 物件導向JavaScript物件
- JS物件導向JS物件
- 物件導向(上)物件
- scala物件導向物件
- 物件導向(oop)物件OOP
- 物件導向trick物件
- 物件導向-介面物件
- 物件導向One物件
- 物件導向思想物件
- Java物件導向Java物件
- [Java物件導向]Java物件
- 談談“物件導向”與“程式導向”物件
- 從物件導向到模式再到真正的物件導向 (轉)物件模式
- iOS 開發之 OOA (物件導向分析) & OOD (物件導向設計)& OOP (物件導向程式設計)iOS物件OOP程式設計
- JAVA_15 物件導向程式設計(下)Java物件程式設計
- 物件導向程式設計,我的思想[下]物件程式設計
- python-程式導向、物件導向、類Python物件
- php中的程式導向與物件導向PHP物件
- Js物件導向(1): 理解物件JS物件
- Java物件導向——類與物件Java物件
- 什麼是物件,為什麼要物件導向,怎麼才能物件導向?物件
- 物件導向筆記物件筆記