一、类的继承
什么是继承:继承是一种新建类的方式,继承了一个类,类中的属性和方法就在字类中
被继承的类叫做:父类/基类
继承的类叫做:字类/派生类
新式类:只要继承了object类,就是新式类,在python3中,默认继承object类/在python2中,需要显示的指定继承object
经典类:没有继承object的类,就是经典类,Python3中没有经典类,只有Python2中才有
class A(object):
pass
class C:
pass
# B继承了A,C类
class B(A, C):
pass
# 类名
print(B.__name__)
# B的父类
print(B.__bases__)
二、利用继承减少代码冗余,菱形问题
# 属性的查找顺寻
# 先找对象-->类中找-->父类中找(多继承)-->报错
class Person(object):
school = 'old_boy'
def __init__(self, name, age):
self.name = name
self.age = age
class Teacher(Person):
pass
class Student(Person):
pass
# 继承的菱形问题(显示的都继承一个类,不是object类):
# 新式类(py3中全是新式类): 广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
# 经典类(只有py2中才有): 深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形顶点)
三、重用父类的两种方式
# 第一种方式:父类.__init__方法
class Person:
def __init__(self, name ,age):
self.name = name
self.age = age
class Teacher(Person):
def __init__(self, name, age, level):
A.__init(self, name ,age)
self.level = level
# 第二种方式:super()方法
class Person(object):
school = 'oldboy'
def __init__(self,name,age):
self.name=name
self.age=age
def study(self):
print('study....')
class Student(Person):
school = 'yyyy'
def __init__(self,name,age,course):
#super() 会按照mro列表拿到父类对象
#对象来调用绑定方法,不需要传递第一个参数(self)
super().__init__(name,age)
#经典类和新式类
#经典类中必须这么写(py3中没有经典类),都用上面那种方式写
# super(Student,self).__init__(name,age)
self.course=course
def study(self):
# Person.study(self)
super().study()
# print("%s学生在学习"%self.name)