day 24 类的继承

1.继承的介绍
什么是继承:
是一种新建类的方式,继承了一个类,类中的属性和方法就在子类中

父类/基类

子类/派生类

新式类:只要继承了object类,就是新式类,在python3中,默认继承object类
Python3中:默认继承object
Python2中,需要显示的指定继承object
经典类:没有继承object的类,就是经典类
python3中没有经典类
python2中才有


class A(object):
pass
class C:
pass
#B继承了A这个类
class B(A,C):
pass

#类的其他内置属性 __名字__
print(B.__dict__)
#类名
print(B.__name__)
#B的父类
print(B.__bases__)


2.利用继承,减少代码冗余
问题一:如何重用父类的属性
问题二:属性的查找顺序是什么
先找对象---->类中找----->父类中找(多继承)----->报错
问题三:如何重用父类的方法

class Person(object):
school = 'oldboy'
def __init__(self, name, age):
self.name = name
self.age = age
class Teacher(Person):
pass
class Student(Person):
pass


# 类实例化会自动调用__init__如果类中没有,去父类中找
stu1=Student() #报错,因为父类中必须传两个参数
stu1 = Student('nick', 18)
print(stu1.school)


多层继承
class A:
a="AAAA"
class B(A):
a="BBB"

class C(B):
a="CCC"
pass

class D(C):
a = "DDD"
pass
class D(C):
a = "DDD"
pass

d=D()
print(d.a)

多继承
class A:
a="AAAA"
pass
class B:
a="BBB"
pass

class C:
a="CCC"
pass

class D(A,B,C):
a = "DDD"
pass

d=D()
print(d.a)

#多继承的多层
继承的菱形问题:新式类和经典类的查找顺序是不一样的
新式类的查找属性:广度优先
经典类:深度优先
class G(object):
a = "GGG"
pass
class F(G):
# a = "FFF"
pass
class E(G):
# a = "EEE"
pass
class D(G):
# a = "DDD"
pass
class C(F):
# a="CCC"
pass
class B(E):
# a="BBB"
pass
class A(B,C,D):
# a="AAAA"
pass

a=A()
print(a.a)

class G(object):
a = "GGG"
pass
class F(G):
# a = "FFF"
pass
class E(G):
# a = "EEE"
pass
class D(G):
# a = "DDD"
pass
class C(F):
# a="CCC"
pass
class B(E):
# a="BBB"
pass
class A(B,C,D):
# a="AAAA"
pass

a=A()
print(a.a)

#mro 列表,继承顺序查找列表(只在新式类中有)
print(A.mro())
print(A.__mro__)


#继承的菱形问题(显示的,都继承一个类,不是object类):新式类和经典类的查找顺序是不一样的
新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

不出现菱形问题:正常查找



3.继承重用父类方法方式一:指名道姓的使用(类名.属性名方法名 跟继承没有关系)
class A:
    def __init__(self,name,age):
self.name=name
self.age=age

class Person:
school = 'oldboy'
def __init__(self,name,age):
self.name=name
self.age=age
def study(self):
print('study....')

class Teacher(Person):

def __init__(self,name,age,level):
A.__init__(self,name,age)
# self.name=name
# self.age=age
self.level=level

class Student(Person):
school = 'yyyy'
def __init__(self,name,age,course):
#如何重用父类的__init__方法
Person.__init__(self,name,age)
self.course=course
def study(self):
Person.study(self)
print("%s学生在学习"%self.name)


stu1=Student('wed',19,"Python")
# stu1.school='xxx'
print(stu1.school)
stu1.study()


4.继承重用父类方法方式二:通过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()相当于得到了一个特殊对象,第一个参数不需要传,调用绑定方法,会把自己传过去
         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)


stu1=Student('wed',19,"Python")
# stu1.school='xxx'
# print(stu1.school)
stu1.study()



原文地址:https://www.cnblogs.com/wwei4332/p/11418769.html