1. 程式人生 > >面向對象(4)--繼承和多態

面向對象(4)--繼承和多態

覆蓋 func 對象 value -- eval 一個人 pass n)

一、繼承

繼承的類稱為子類,被繼承的類稱為基類,父類,或超類。

繼承的優點:

  • 簡化了代碼
  • 提高了代碼的健壯性
  • 提高了代碼的安全性
  • 多態的前提

缺點:耦合與內聚。耦合性越低,內聚性越高,代碼越好。

比如,有一個Animal類,有個run方法:

In [1]: class Animal:
   ...:     def run(self):
   ...:         print(我正在跑步!!!)
   ...:

當我們需要創建Dog和Cat類時,可以直接繼承Animal:

In [3]: class Dog(Animal):
   ...:     
pass ...: In [4]: class Cat(Animal): ...: pass

由於Animal有run方法,通過繼承,Dog和Cat也自動擁有了run方法。

In [5]: dog=Dog()
In [6]: dog.run()
我正在跑步!!!

In [7]: xjm=Cat()
In [8]: xjm.run()
我正在跑步!!!

在·此時你有沒有想過,每個動物的run方法都不一樣,有飛的,有遊的。有跳的,有爬的。

所以我們可以對子類的方法進行重寫,而重寫後,子類的run方法會覆蓋父類的run方法。這樣就體現了繼承的一個好處:多態。繼承正是多態的前提。

In [9]: class Cat(Animal):
   ...:     def run(self):
   ...:         print(xjm正在爬呀爬呀!!!)
   ...:

In [10]: xjm=Cat()

In [11]: xjm.run()
xjm正在爬呀爬呀!!!

二、多繼承

每個孩子都有自己爸爸媽媽,類是否一樣呢?多繼承:

首先創建一個Father類:

In [18]: class Father():
    ...:     def __init__(self,money):
    ...:         self.money
=money ...: def play(self): ...: print(我很皮) ...: def func(self): ...: print(父親的方法)

再創建一個Mother類:

In [19]: class Mother():
    ...:     def __init__(self,faceValue):
    ...:         self.faceValue=faceValue
    ...:     def eat(self):
    ...:         print(我是吃貨)
    ...:     def func(self):
    ...:         print(母親的方法)

先來滿足這樣一個需求,孩子繼承Father的錢money。繼承Mother的顏值faceValue

再來創建子類來繼承Father和Mother:

In [21]: class Child(Father,Mother):
    ...:     def __init__(self,money,faceValue):
    ...:         Father.__init__(self,money)
    ...:         Mother.__init__(self,faceValue)

最後來實現一下:

In [23]: c=Child(30000,99)

In [24]: c.money
Out[24]: 30000

In [25]: c.faceValue
Out[25]: 99

In [26]: c.play()
我很皮

In [27]: c.eat()
我是吃貨

In [28]: c.func()
父親的方法

說明:父類中方法名相同,默認調用的是括號中排前面的父類中的方法。

三、多態

概念:一種事物的多種形態

要理解什麽是多態,我們首先要對數據類型再作一點說明。當我們定義一個class的時候,我們實際上就定義了一種數據類型。我們定義的數據類型和Python自帶的數據類型,比如str、list、dict沒什麽兩樣:

In [12]: a=list()

In [13]: b=Animal()

In [14]: c=Cat()

In [15]: isinstance(a,list)
Out[15]: True

In [16]: isinstance(c,Cat)
Out[16]: True

In [17]: isinstance(c,Animal)
Out[17]: True

從上面代碼可以看出,c對象既屬於Cat類,又屬於Animal類。

那麽多態有什麽好處呢?通過一下一個事例來一一說明:

class Person():
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender
    def who(self):
        print(我是一個人,我的名字是%s%self.name)

class Student(Person):
    def __init__(self,name,gender,score):
        super(Student,self).__init__(name,gender)
        self.score=score
    def who(self):
        print(我是一名學生,我的名字是%s%self.name)
class Teacher(Person):
    def __init__(self,name,gender,course):
        super(Teacher,self).__init__(name,gender)
        self.course=course
    def who(self):
        print(我是一名老師,我的名字是%s%self.name)
def who(x):
    x.who()
a=Person(小狗,)
b=Student(小貓,,99)
c=Teacher(小雞,不男不女,python)
who(a)
who(b)
who(c)

我是一個人,我的名字是小狗
我是一名學生,我的名字是小貓
我是一名老師,我的名字是小雞

 

面向對象(4)--繼承和多態