你是不是也曾遇到过这样的困扰:当你想扩展现有类的功能时,发现复制粘贴大量代码后,一旦基础逻辑需要调整,就得在所有粘贴过的地方逐一修改,既繁琐又容易出错?
我们接下来来聊聊Python代码中的“继承”:类是用来描述现实世界中同一组事务的共有特性的抽象模型,但是类也有上下级和范围之分,比如:生物 => 动物 => 哺乳动物 => 灵长型动物 => 人类 => 黄种人
从哲学上说,就是共性与个性之间的关系,比如:白马和马!所以,我们在OOP代码中,也一样要体现出类与类之间的共性与个性关系,这里就需要通过类的继承来体现。简单来说,如果一个类A使用了另一个类B的成员(属性和方法),我们就可以说A类继承了B类,同时这也体现了OOP中代码重用的特性!
假设A类要继承B类中的所有属性和方法(私有属性和私有方法除外)
class B(object): passclass A(B): passa = A()a.B中的所有公共属性a.B中的所有公共方法
Person类与Teacher、Student类之间的继承关系
class Person(object): def eat(self): print('i can eat food!') def speak(self): print('i can speak!')class Teacher(Person): passclass Student(Person): passteacher = Teacher()teacher.eat()teacher.speak()student = Student()student.eat()student.speak()
继承:一个类从另一个已有的类获得其成员的相关特性,就叫作继承!
派生:从一个已有的类产生一个新的类,称为派生!
很显然,继承和派生其实就是从不同的方向来描述的相同的概念而已,本质上是一样的!
父类:也叫作基类,就是指已有被继承的类!
子类:也叫作派生类或扩展类
扩展:在子类中增加一些自己特有的特性,就叫作扩展,没有扩展,继承也就没有意义了!
单继承:一个类只能继承自一个其他的类,不能继承多个类,单继承也是大多数面向对象语言的特性!
多继承:一个类同时继承了多个父类, (C++、Python等语言都支持多继承)
单继承:一个类只能继承自一个其他的类,不能继承多个类。这个类会有具有父类的属性和方法。
基本语法:
# 1、定义一个共性类(父类)class Person(object): pass# 2、定义一个个性类(子类)class Teacher(Person): pass
比如汽车可以分为两种类型(汽油车、电动车)
# 1、定义一个共性类(车类)class Car(object): def run(self): print('i can run')# 2、定义汽油车class GasolineCar(Car): pass# 3、定义电动车class EletricCar(Car): passbwm = GasolineCar()bwm.run()
在Python继承中,如A类继承了B类,B类又继承了C类。则根据继承的传递性,则A类也会自动继承C类中所有属性和方法(公共)
class C(object): def func(self): print('我是c类中的相关方法func')class B(C): passclass A(B): passa = A()a.func()
在定义类时,其没有遵循类的命名规则
答:在Python中,类理论上是不区分大小写的。但是要遵循一定的命名规范:首字母必须是字母或下划线,其中可以包含字母、数字和下划线,而且要求其命名方式采用大驼峰。
电动汽车:EletricCar
父类:Father
子类:Son
父类一定要继承object么?Car(object)
答:在Python面向对象代码中,建议在编写父类时,让其自动继承object类。但是其实不写也可以,因为默认情况下,Python中的所有类都继承自object。
打印属性和方法时,都喜欢用print
class Person(): def __init__(self, name): self.name = name def speak(self): print('i can speak')# 创建对象,打印属性和方法p = Person('Tom')print(p.name)p.speak()
今日学习完毕,课后作业:
动物声音模拟器,题目要求:
① 创建一个基类 Animal(动物)。
② 创建一个子类 Dog(狗),它继承自 Animal类。
③ 在 Animal类中定义一个 speak()方法,该方法打印:"动物发出声音..."。
④ 在 Dog类中重写 speak()方法,使其打印:"汪汪汪!"。
⑤ 在 main函数中,分别创建 Animal和 Dog的对象,并调用它们的 speak()方法,观察运行结果。