Python是一门面向对象语言
面向对象的三大特征:封装、继承、多态
我们这里来看一下python 类的继承
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
一:类的继承
1:继承语法
arduino
复制代码
class 派生类名(基类名) ...
通常我们定义的类没有指定继承对象都是继承自object类,另外,python是支持多继承的。
下边我们使用代码来演示一下python的继承:
我们定义一个person类,其中有name、age两个属性,getInfo方法,为父类。
我们定义一个school类,其中getSchoolInfo方法,为父类。
定义一个teacher类,继承person、school类,其中有name、age、teacherNumber
三个属性
定义一个student类,继承person、school类。其中有name、age、studentNumber三个属性
上代码:
python
复制代码
class Person(object): """ person类 """ # 姓名 name = '' # 年龄 age = '' # 构造函数 def __init__(self, name, age): self.name = name self.age = age # 获取信息 def getInfo(self): li = {'name' : self.name, 'age' : self.age} print('姓名为:', self.name, "年龄为:", self.age) class School(object): """ school类 """ type = '' # 获取信息 def getSchoolInfo(self): print("我在时间里的大学") class Teacher(Person, School): """ 教师类,继承person类 """ # 姓名 name = '' # 年龄 age = '' # 教工号 teacherNumber = '' # 构造函数 def __init__(self, name, age, teacherNumber): self.name = name self.age = age self.teacherNumber = teacherNumber class Student(Person, School): """ 教师类,继承person类 """ # 姓名 name = '' # 年龄 age = '' # 学生号 studentNumber = '' # 构造函数 def __init__(self, name, age, studentNumber): self.name = name self.age = age self.studentNumber = studentNumber
调用:
scss
复制代码
S = Student('张三', 15, '20210101') S.getInfo() S.getSchoolInfo() T = Teacher('李四', 35, 5) T.getInfo() S.getSchoolInfo()
输出:
复制代码
姓名为: 张三 年龄为: 15 我在时间里的大学 姓名为: 李四 年龄为: 35 我在时间里的大学
上边的代码我们演示了python基本的继承与多继承,子类分别调用了父类person中的getInfo方法,School中的getSchoolInfo方法
但是,因为父类person中的getinfo方法只能打印名字和年龄。
但是学生还有学号,教师还有工龄需要输出,那么我们就需要用到下边的方法重写。
二:方法重写
Python中类的方法的重写比较简单
直接在子类中声明与父类中的方法名相同的方法即可。
使用上边的代码,person类与school类中的代码不变
python
复制代码
class Teacher(Person, School): """ 教师类,继承person类 """ # 姓名 name = '' # 年龄 age = '' # 教工号 teacherNumber = '' # 构造函数 def __init__(self, name, age, teacherNumber): self.name = name self.age = age self.teacherNumber = teacherNumber # 获取信息 def getInfo(self): li = {'name': self.name, 'age': self.age} print('姓名为:', self.name, "年龄为:", self.age, "教工号为:", self.teacherNumber) class Student(Person, School): """ 教师类,继承person类 """ # 姓名 name = '' # 年龄 age = '' # 学生号 studentNumber = '' # 构造函数 def __init__(self, name, age, studentNumber): self.name = name self.age = age self.studentNumber = studentNumber # 获取信息 def getInfo(self): li = {'name': self.name, 'age': self.age} print('姓名为:', self.name, "年龄为:", self.age, "学号为:", self.studentNumber) S = Student('张三', 15, '20210101') S.getInfo() S.getSchoolInfo() T = Teacher('李四', 35, 5) T.getInfo() S.getSchoolInfo()
输出:
复制代码
姓名为: 张三 年龄为: 15 学号为: 20210101 我在时间里的大学 姓名为: 李四 年龄为: 35 教工号为: 5 我在时间里的大学
三:类的多态
Python是一门动态语言
静态语言与动态语言的区别:
静态语言和动态语言关于多态的区别 。静态语言实现多态的三个必要条件
1. 继承
2. 方法重写
3. 父类引用指向子类对象
动态语言的多态崇尚“鸭子类型"当看到一只鸟走起来像鸭子、游泳起来像鸭子、 收起来也像鸭子,那么这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心 对象是什么类型,到底是不是鸭子,只关心对象的行为。
下边我们使用一段代码来演示一下python的多态
kotlin
复制代码
# 父类 动物 class Animal: def eat(self): print("动物吃东西!") # 子类 狗 class Dog(Animal): def eat(self): print("吃肉!") # 子类 猴 class Monkey(Animal): def eat(self): print("吃香蕉!") # 父类 人 class Person(object): def eat(self): print("吃五谷杂粮!") # 定义一个函数 参数是一个对象 def fun(obj): obj.eat() fun(Dog()) fun(Monkey()) fun(Person())
输出:
复制代码
吃肉! 吃香蕉! 吃五谷杂粮!
上边的代码我们定义了一个animal父类,定义了一个Dog,Monkey子类继承animal
我们又定义了一个person类
相同的是,这个类中都是有eat方法的
我们有定义了一个函数,传入参数是一个对象,函数内部调用了对象中的eat方法
这个就对上了我们上边说的鸭子类型。
有好的建议,请在下方输入你的评论。