继承的作用和菱形问题
Posted aden668
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了继承的作用和菱形问题相关的知识,希望对你有一定的参考价值。
继承的作用
可以利用继承来减少代码冗余
class Person:
school='aaaa'
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
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 列表,继承顺序查找列表(只在新式类中有)1
print(A.mro())
print(A.__mro__)
GGG
[<class ‘main.A‘>, <class ‘main.B‘>, <class ‘main.E‘>, <class ‘main.C‘>, <class ‘main.F‘>, <class ‘main.D‘>, <class ‘main.G‘>, <class ‘object‘>]
(<class ‘main.A‘>, <class ‘main.B‘>, <class ‘main.E‘>, <class ‘main.C‘>, <class ‘main.F‘>, <class ‘main.D‘>, <class ‘main.G‘>, <class ‘object‘>)
继承的菱形问题(显示的都继承一个类,不是object类):新式类和经典类的查找顺序是不一样的
新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)
不出现菱形问题:正常查找
以上是关于继承的作用和菱形问题的主要内容,如果未能解决你的问题,请参考以下文章
C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承
C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承
C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承
C++进阶:继承C++为什么要引入继承 | 继承概念及定义 | 基类和派生类对象赋值转换 | 继承中的作用域 | 派生类的默认成员函数 | 继承与友元/静态成员 | 复杂的菱形继承及菱形虚拟继承