Python(三十一)python类class继承与多态

94 阅读4分钟

Python是一门面向对象语言

面向对象的三大特征:封装、继承、多态

我们这里来看一下python 类的继承

通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。

一:类的继承

1 :继承语法

class 派生类名(基类名)
    ...

 

通常我们定义的类没有指定继承对象都是继承自object类,另外,python是支持多继承的。

下边我们使用代码来演示一下python的继承:

我们定义一个person类,其中有name、age两个属性,getInfo方法,为父类。

我们定义一个school类,其中getSchoolInfo方法,为父类。

定义一个teacher类,继承person、school类,其中有name、age、teacherNumber

三个属性

定义一个student类,继承person、school类。其中有name、age、studentNumber三个属性

上代码:

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

调用:

S = Student('张三', 15, '20210101')
S.getInfo()
S.getSchoolInfo()
T = Teacher('李四', 355)
T.getInfo()
S.getSchoolInfo()

输出:

姓名为: 张三 年龄为: 15
我在时间里的大学
姓名为: 李四 年龄为: 35
我在时间里的大学

 

上边的代码我们演示了python基本的继承与多继承,子类分别调用了父类person中的getInfo方法,School中的getSchoolInfo方法

但是,因为父类person中的getinfo方法只能打印名字和年龄。

但是学生还有学号,教师还有工龄需要输出,那么我们就需要用到下边的方法重写。

 

二:方法重写

Python中类的方法的重写比较简单

直接在子类中声明与父类中的方法名相同的方法即可。

使用上边的代码,person类与school类中的代码不变

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('李四'355)
T.getInfo()
S.getSchoolInfo()

输出:

姓名为: 张三 年龄为: 15 学号为: 20210101
我在时间里的大学
姓名为: 李四 年龄为: 35 教工号为: 5
我在时间里的大学

 

三:类的多态

Python是一门动态语言

静态语言与动态语言的区别:

静态语言和动态语言关于多态的区别  。静态语言实现多态的三个必要条件

1.      继承

2.      方法重写

3.      父类引用指向子类对象

 

动态语言的多态崇尚“鸭子类型"当看到一只鸟走起来像鸭子、游泳起来像鸭子、  收起来也像鸭子,那么这只鸟就可以被称为鸭子。在鸭子类型中,不需要关心  对象是什么类型,到底是不是鸭子,只关心对象的行为。

下边我们使用一段代码来演示一下python的多态

# 父类 动物
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方法

这个就对上了我们上边说的鸭子类型。

 

有好的建议,请在下方输入你的评论。