??? Python的继承机制,可以轻松实现类的复用。Python可以是单根继承或多重继承两种。继承机制经常用于在不影响现有类的基础上,创建与现有类功能类似的新类,对现有类进行功能扩展;或是现有类的属性不够描述新的需求,需要在现有类基础上添加一些新属性和方法。
需要指出的是,Python中,子类继承父类的一般语法结构如下:
class 子类名(父类名):
构造函数
……
定义类属性
……
定义类函数
……
??? ??继承是面向对象的重要性质之一,它主要用于描述类与类之间的关系,在不改变原有类的基础上扩展原有类的功能。若类与类之间具有继承关系,被继承的类称为父类或基类,继承其他类的类称为子类或派生类,子类会自动拥有父类的公有成员。
??? 若在定义类时不指明该类的父类,那么该类默认继承基类object。
如果需要在派生类中调用基类的方法,可以使用内置函数super()或者通过“基类名.方法名()”的方式来实现这一目的。
class Father:
def get_money(self):
print("负责赚钱")
def driving(self):
print("会驾驶")
def math(self):
print("会学习数学")
class Son(Father):
def python(self):
print("会学python")
Father.get_money(self)
super().math()
son = Son()
son.python()
???? 定义一个猫类Cat和一个继承Cat类的折耳猫类ScottishFold,代码如下:
class Cat(object):
def __init__(self,color):
self.color=color
def walk(self):
print("走猫步~")
#定义继承Cat类的ScottishFold类
class ScottishFold(Cat):
pass
fold=ScottishFold("灰色")
print(fold.color+"的折耳猫")
fold.walk()
??? (1) 在使用单根继承的时候,父类中的函数、属性都可以被子类继承;反过来,子类中的属性、函? 数却无法被父类使用。
??? (2) 若想使用父类中的成员,在使用super()函数,表达完父类之后,需要加入“.”运算符。即:? “super().”。
??? (3) 父类的逻辑范围比子类的逻辑范围要广大。
??? (4) 父类中包含全部子类抽象出来的共同点。子类与子类之间,有互不相同的特点。
??? (5) 父类与所有的子类中,可以包含相同命名的方法。这些方法的运算逻辑是可以不一样的。子类? 从父类继承得来的类方法中,是可以给子类直接使用的,但有的时候,需要对类方法进行修改。? 针对这种情况,我们就需要在子类中重写父类的方法。如,本节例题中的eat()方法。
?
多继承?
??? 程序中一个类也可以继承多个类,即子类具有多个父类,也自动拥有所有父类的公有成员。
??? Python中多继承的语法格式如下所示:
??? class 子类名(父类名1,父类名2,…..):
??? 例如,定义一个表示房屋的类House、一个表示汽车的类Car和一个继承House和Car的子类TouringCar,代码如下:
class House(object):
def live(self):
print("供人居住")
class Car(object):
def drive(self):
print("行驶")
class TouringCar(House,Car):
pass
tour_car=TouringCar()
tour_car.live()
tour_car.drive()
??? 从以上结果可以看出,子类继承多个父类后自动拥有了多个父类的公有成员。
??? 试想一下,如果House类和Car类中有一个同名的方法,那么子类会调用哪个父类的同名方法呢?
class House(object):
def live(self):
print("供人居住")
def test(self):
print("House类测试")
class Car(object):
def drive(self):
print("行驶")
def test(self):
print("Car类测试")
class TouringCar(House,Car):
pass
tour_car=TouringCar()
tour_car.live()
tour_car.drive()
tour_car.test()
? 如果子类继承的多个父类是平行关系的类,那么子类先继承哪个类,便会调用哪个类的方法。