python面向对象编程-继承与派生
一.什么是继承
继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类
继承的特性是:子类会遗传父类的属性
强调:继承是类与类之间的关系
二.为什么用继承
因为继承的好处就是可以减少代码的冗余
三.如何继承
在python中支持一个类同时继承多个父类
在python3中
如果一个类没有继承任何类,那默认继承object类
在python2中
如果一个类没有继承任何类,不会继承object类
强调:在python3中都是新式类,只要在python2中才区别新式类与经典类
新式类和经典类的区分:
新式类:但凡继承了object的类以及该类的子类,都是新式类
经典类:没有继承object的类以及该类的子类都是经典类
class Parent1: #定义父类
pass
class Parent2: #定义父类
pass
class Sub1(Parent1): #单继承,基类是ParentClass1,派生类是SubClass
pass
class Sub2(Parent1,Parent2): #python支持多继承,用逗号分隔开多个继承的类
pass
查看继承:
print(Paren1.__bases__)
print(Paren2.__bases__)
print(Sub1.__bases__)
四. 派生:
子类中新定义的属称为派生,在使用中始终以自己的为准
对象查找属性的顺序:对象自己-》对象的类-》父类-》父类。
在子类派生出的新功能中重用父类功能的方式有两种:
方式一:与继承无关
指名道姓法,直接用:类名.函数名 (当成普通函使用,该传几个值就传几个)
# class OldboyPeople:
# school = 'oldboy'
#
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# class OldboyStudent(OldboyPeople):
# def __init__(self,name,age,sex,stu_id):
# OldboyPeople.__init__(self,name,age,sex) ####直接调用,当成普通函使用,该传几个值就传几个
# self.stu_id=stu_id
#
# def choose_course(self):
# print('%s is choosing course' %self.name)
直接调用,当成普通函使用,该传几个值就传几个
# self.stu_id=stu_id
#
# def choose_course(self):
# print('%s is choosing course' %self.name)
方式二:严格按照继承属性查找关系
super()会得到一个特殊的对象,该对象就是专门用来访问父类中的属性的(按照继承的关系)
super().__init__(不用为self传值)
注意:
super的完整用法是super(自己的类名,self),在python2中需要写完整,而python3中可以简写为super()
# class OldboyPeople:
# school = 'oldboy'
#
# def __init__(self, name, age, sex):
# self.name = name
# self.age = age
# self.sex = sex
#
# class OldboyStudent(OldboyPeople):
# def __init__(self,name,age,sex,stu_id):
# # OldboyPeople.__init__(self,name,age,sex)
# super(OldboyStudent,self).__init__(name,age,sex) # ##super()__init__(name,age,sex)
# self.stu_id=stu_id
#
# def choose_course(self):
# print('%s is choosing course' %self.name)
#
#
# stu1=OldboyStudent('猪哥',19,'male',1)
# print(stu1.__dict__)
#
# print(OldboyStudent.mro())