1. 程式人生 > >python0.15-----繼承和多態

python0.15-----繼承和多態

RKE In cat 優先 ont work 基類 OS 聯系

繼承:有兩個類,A類和B類,當我們說A類繼承自B類的時候,那麽A類就擁有了B類的所有屬性和方法。
object類是所有類的父類,還可以成為基類或者超類。
例如:person是object類的子類。person的屬性有name,age,eat(),run()。若有100多種類型的人,那麽要寫100多次name,age,eat(),run()。運用繼承的機制。使worker和student繼承person。那麽worker和student類在創建時,有已經有了name,age,eat(),run()屬性和方法。

繼承的優點
1.簡化了代碼,減少冗余。 100多個類不用寫其父類的屬性和方法。
2.提高了代碼的健壯性。 若要修改代碼,若用了繼承的方式,有些情況只需要修改person類即可,然而若是沒有使用繼承,那麽100多個類全都要進行修改。


3.提高了代碼的安全性。 外界並不知道父類的名字,也就不能刪除父類的屬性和方法。
4.是多態的前提。

缺點:耦合和內聚是描述類與類之間的關系的。耦合是指類與類之間的聯系。例如:person和worker耦合性高,worker和student耦合性低。耦合性越低,內聚性越高代碼越好。

單繼承的實現:
from Person import Person
class Student(Person):
  def __init__(self,name,age,book):
    self.book=book
    super(Student,self).__init__(name,age)   #super(student,self)表示Person類名,整個語句表示子類調用父類中的__init__()方法。

疑惑:為什麽子類要重寫__init__()方法,直接繼承父類的__init__()方法不就完事了嗎?No!因為__init__()方法主要目的是定義對象屬性。子類相對於父類,一般會增加一些屬性,例如:book,因此需要重寫__init__()方法。

如果父類裏面有私有屬性,可以看成子類能夠繼承過來這個屬性。只是不能在子類裏面訪問子類,卻可以通過父類的共有方法進行修改和查找這個私有屬性。


多繼承的實現:
例如:子類Child繼承父類Father和Mother
from Father import Father
class Child(Father,Mother):
  def __init__(self,name,age,book):


    self.book=book
    Father.__init__(name)   #多個父類直接用父類名,用super不知道選擇哪一個父類名。
    Mother.__init__(age)   #註意繼承的實參和形參
註意:若多個父類有相同方法名,默認調用的是括號中排前面的父類的方法。例如:上面的Child類優先調用Father的同名方法。

多態:表示一種事物有多種形態。主要功能也是節省代碼。

例子1:定義貓和狗吃東西的類

思路:在不采用多態思想的情況下,如果貓和狗吃東西,則定義貓和狗的類,在類裏面分別定義eat()的方法。如果有100種動物,則分別要在相應的類下面定義eat()方法,很麻煩。若采用多態的思想,由於貓和狗都繼承自animal類,通過在animal類裏面定義eat()方法讓貓和狗繼承就可以簡化代碼並實現同樣的功能。少寫99次eat()方法。

原始代碼為:
class Cat:
  def __init__(self,name):
    self.name=name
    def eat(self):
    print(self.name+‘eat.......‘)

class Mouse:
  def __init__(self,name):
    self.name=name
    def eat(self):
    print(self.name+‘eat......‘)

采用多態的思想後的代碼:
class Animal:
  def __init__(self,name):
    self.name=name
    def eat(self):
    print(self.name+‘eat......‘)

class Cat:
  def __init__(self,name):
    super(Cat,self).__init__(name)

class Mouse:
  def __init__(self,name):
    super(Cat,self).__init__(name)

現在還看不出來多態的優點,但是若是有100種動物,那麽采用多態的思想後,可以少寫99個eat()方法,其實還是挺簡潔的。


例2:定義一個類,可以餵貓和老鼠,蛇,雞鴨鵝等等吃東西。
思路:若是沒有采用多態的思想,那麽要寫feedCat()方法和feedMouse(),feedSnake()等等無數個方法。采用多態的方法,只需要寫feedAnimal()方法就行了。

原始代碼:
class Person(object):
  def feedCat(cat):
    print(‘給你食物‘)
    cat.eat()
  def feedDog(dog):
    print(‘給你食物‘)
    dog.eat()
  …………
  def feedSnake(snake):
    print(‘給你食物‘)
    snake.eat()

采用多態思想後的代碼:
class Person(object):
  def feedAnimal(animal):
    animal.eat()

python0.15-----繼承和多態