目录
继承
继承介绍
如何使用继承
class 类名(父类1,父类2):
pass
概念:是一种新建类的方式,继承了一个类,类中的属性和方法就在子类中
- 父类/基类
- 子类/派生类
新式类:只要继承了object类,就是新式类,再python3中,默认继承object类
- Python3中:默认继承object
class A:
pass - python2中,需要显示的指定继承object
经典类:没有继承object的类,就是经典类
- python3中没有经典类
- python2中才有
利用继承减少代码冗余,菱形问题
减少代码冗余
class Public:#父类
school ='electronic'
class Teacher(Public):#子类
def __init__(self, course_choice):
self.course_choice = course_choice
class Student(Public):#子类
def __init__(self, name):
self.name= name
菱形问题
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
class C(A):
def test(self):
print('from C')
class D(B):
def test(self):
print('from D')
class E(C):
def test(self):
print('from E')
class F(D,E):
# def test(self):
# print('from F')
pass
print(F.mro())
[<class 'main.F'>, <class 'main.D'>, <class 'main.B'>, <class 'main.E'>, <class 'main.C'>, <class 'main.A'>, <class 'object'>]
在新式类中是广度优先
在经典类中是深度优先
重用父类方法
方法一:指名道姓的方式,跟继承关系无关
class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
def init_1(self,name,age):
self.name=name
self.age=age
class Student:
school = 'yyyy'
def __init__(self,name,age,course):
#指名道姓的使用Person的__init__方法
# Person.__init__(self,name,age)
# init_1(self,name,age)
self.course=course
stu=Student('nick',19,'python')
print(stu.name)
方法二:通过super关键字,跟继承关系有关
class Person(object):
def __init__(self,name,age):
self.name=name
self.age=age
class Student(Person):
school = 'yyyy'
def __init__(self,name,age,course):
#super()相当于得到了一个特殊对象,第一个参数不需要传,调用绑定方法,会把自己传过去
########## self不需要传,不需要传
# super().__init__(name,age)
#看到别人这么写:super(类名,对象) 在py3中为了兼容py2
#在py3中这么写和省略写法完全一样
#在py2中必须super(Student,self)写
super(Student,self).__init__(name,age)
self.course=course
总结
有继承关系的时候,通常用super,指名道姓的方式在什么情况下用?
1.没有继承关系
2.如果继承了多个父类,super是按照mro列表找,现在想指名道姓的用某个父类的某个方法,就需要指名道姓的使用