继承:有两个类,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()