为了账号安全,请及时绑定邮箱和手机立即绑定

【九月打卡】第3天 Python类的继承

课程名称Python3 进阶教程(新版)
章节名称第3章 Python类的继承
讲师名称咚咚呛

课程内容

  • 继承类
  • 判断类型
  • 多态
  • 多重继承
  • 获取对象信息

学习收获

继承类

继承:新类不需要重头编写,继承父类所有的属性、功能,子类只需要实现缺少的新功能。

在定义继承类的时候,有几点是需要注意的:

  • 在定义子类的时候,需要在括号内写明继承的父类的类名。

  • __init__()方法,需要调用super(子类名, self).__init__(name, gender),来初始化从父类继承过来的属性。

class Person(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
class Teacher(Person):
    def __init__(self,name,age,course):
        super(Teacher,self).__init__(name,age)
        self.course = course
        
lee = Teacher('lee','24','English')

print(lee.course,lee.name)

判断类型

通过函数isinstance()可以判断一个变量的类型。

在一条继承链上,一个父类的实例不能是子类类型,因为子类比父类多了一些属性和方法。

在一条继承链上,一个实例可以看成它本身的类型,也可以看成它父类的类型。

class Animal:
    def __init__(self,name,age):
        self.name = name
        self.age = age
        
class Dog(Animal):pass

class Cat(Animal):pass

dog = Dog('huahua',2)
cat = Cat('kitty',3)

print(isinstance(dog,Dog)) # ==> True

print(isinstance(dog,Animal)) # ==> True
        
print(isinstance(dog,object)) # ==> True

print(isinstance(dog,Cat)) # ==> False

多态

从基类派生出的子类,重写了基类中的方法,这种行为叫做多态。

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    def who(self):
        return 'I am a Person, my name is %s' % self.name

class Student(Person):
    def __init__(self, name, gender, score):
        super(Student, self).__init__(name, gender)
        self.score = score
    def who(self):
        return 'I am a Student, my name is %s' % self.name

class Teacher(Person):
    def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
    def who(self):
        return 'I am a Teacher, my name is %s' % self.name

从定义上来讲,Student和Teacher都拥有来自父类Person继承的who()方法,以及自己定义的who()方法。但是在实际调用的时候,会首先查找自身的定义,如果自身有定义,则优先使用自己定义的函数;如果没有定义,则顺着继承链向上找。

多重继承

除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。多重继承和单继承没有特别大的差异,只是在括号内加入多个需要继承的类的名字即可。

class Person:pass

class Student(Person):pass
        
class Teacher(Person):pass
        
class SkillMixin:pass
        
class BasketballMixin(SkillMixin):pass
    
class FootballMixin(SkillMixin):pass
        
        
class StudentBasketball(Student,BasketballMixin):
    def __init__(self):
        print('I am a student and I can play basketball')
        
class TeacherFootball(Teacher,FootballMixin):
    def __init__(self):
        print('I am a teacher and I can play football')

s = StudentBasketball()
t = TeacherFootball()

实践证明,在多重继承里,某一基类虽然被继承了多次,但是__init__()的方法只调用一次。

多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。

获取对象信息

通过type()函数,可以获得变量的类型。

通过dir()方法,可以获取变量的所有属性。在dir列出的属性中,有很多是以下划线开头和结尾的,这些都是特殊的方法,称为内建方法。

如果已知一个属性名称,要获取或者设置对象的属性,就需要用 getattr()setattr( )函数了。

方法参数前面加一个星号代表传入的参数存储为一个数组(tuple),两个星号就是字典(dict)

打卡截图

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消