2021-6-11

Python面向对象 学习笔记(三)


目录

类的继承(补充)和多态

一、类的多继承

多继承实例:

注意事项:

二、类的多态性

isinstance()方法:

多态的概念和好处:

实例理解:

 分析:

 


 

类的继承(补充)和多态

    一个类继承另一个类时,会自动获得另一个类的所有属性和方法,被继承的类称之为父类,新类称为子类。子类拥有父类所有的属性和方法,并且可以定义自己的属性和方法。

一、类的多继承

Python中的类同样有限的支持多继承形式,子类所继承的多个父类在类定义是,依次于括号中列出,用逗号隔开,形式如下:

class Son(Father1,Father2,Father3...):
    #类体

这里需要注意的是,如果括号内的父类有同名的方法(子类中不含有该方法),并且子类在使用时未指定,则Python将在这些父类中从左至右搜索,并且默认调用第一个出现的父类的方法。

多继承实例:

class Person:
    #定义构造方法
    def __init__(self,name,age):
        self.name = name
        self.age = age
    #定义成员方法
    def speak(self):
        print('%s说:"我今年%d岁。"' %(self.name,self.age))
   
class Athlete:
    def __init__(self,name,sport):
        self.name = name
        self.sport = sport
    def speak(self):
        print('我叫%s,我是一名运动员,我擅长的运动是%s'%(self.name,self.sport))

#同时继承两个类
class Student(Athlete,Person):
    def __init__(self,name,age,Class,num,sport):
        Person.__init__(self,name,age)
        Athlete.__init__(self,name,sport)
        self.Class = Class
        self.num = num

student1 = Student("xiaoming",18,1,"20210129","Basketball")       
student1.speak()#由于Person和Athlete类中都有speak()方法,默认的是调用括号中靠前的父类的方法
#此处即调用了Athlete中的speak()方法

运行结果为:

我叫xiaoming,我是一名运动员,我擅长的运动是Basketball

注意事项:

以上代码中若将

“Person.__init__(self,name,age)                                                                Athlete.__init__(self,name,sport)”

 改为

“super().__init__(name,age)                                                                         super().__init__(name,sport)”

则将两次调用Athlete类的构造方法。

若想使用Person类中的speak()方法,可在Student类中添加以下代码段:

def speak(self):
    Person.speak(self)

二、类的多态性

isinstance()方法:

该方法可用来判断一个变量是不是某个类型,例如:

student1 = Student("xiaoming",18,1,"20210129","Basketball")       
person1 = Person("xiaohong",18)
print(isinstance(student1,Student))#True
print(isinstance(student1,Person))#True
print(isinstance(person1,Student))#False
print(isinstance(student1,Person))#True

通过以上代码可以看出,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看作是该子类所继承的父类,而父类的数据类型,却不能被看作是子类。

多态的概念和好处:

多态指的是为不同数据类型的实体提供统一的接口。可通过以下代码加以理解。

实例理解:

class Person:
    def speak(self):
        print("我是人")

class Teacher(Person):
    def speak(self):
        print("我是老师")
        
class Student(Person):
    def speak(self):
        print("我是学生")
        
class Parent(Person):
    def speak(self):
        print("我是家长")
        
def speaking(individual):
    individual.speak()

speaking(Person())
speaking(Teacher())
speaking(Student())
speaking(Parent())

输出为:

我是人
我是老师
我是学生
我是家长

 分析:

在该实例中,当我们需要在speaking()方法中传入Teacher、Student等类型时,我们只需要接收Person类型就可以了,因为Teacher、Student等类型都是Person类型的子类,子类可以看作是其父类的类型。之后只需要按照Person类型进行操作即可。

由于Person类型本身含有speak()方法,因此,传入的任意类型,只要是Person类或其子类,都会自动调用相应的speak()方法。

若新定义了一些Person类的子类,也无需修改speaking()方法,就能够正常运行。

这就是多态的好处。

 

本博客序列号 hhjxxq-5

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值