python0.15-----繼承和多態
繼承:有兩個類,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-----繼承和多態