面向对象的三大特征之一:继承

Posted 笃行1995

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象的三大特征之一:继承相关的知识,希望对你有一定的参考价值。

继承:

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。需要注意的地方:继承语法   class 派生类名(基类名)://...   基类名写作括号里,基本类是在类定义的时候,在元组之中指明的

从类的的层面上,表示‘’什么‘’是‘’什么“”的关系

class Hero:
    def __init__(self, name, aggresivity, life):
        self.Name = name
        self.Aggresivity = aggresivity
        self.Life =life

    def attract(self,enemy):
        enemy.Life -=self.Aggresivity
class Riven(Hero):
camp =‘Noxus‘
class Garen(Hero): 
camp
= Demacia

g1=Garen(草丛伦,20,120)
r1=Riven(‘潇洒哥‘,30,100)

在该例中,Garen类继承了Hero类:

用上面的湖来说就是,‘Garen是Hero‘

 

何时使用继承:假如我需要定义几个类,而类与类之间有一些公共的属性和方法,这时我就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义,这样只需要继承基类这个动作,就可以访问到基类的属性和方法了,它提高了代码的可扩展性。

在上面的例子中:把Geren类中的__init__()省略。,通过继承Hero达到节省代码.

继承:是基于抽象的结果。抽取比较相像的部分(在上面就是对特征的相似,都有名字,生命值,攻击力)

属性查找:先从对象的命名空间找》》自己的类的命名空间中找》》》父类中找》》》》

class Foo:
    def f1(self):
        print(from Foo.f1)
        self.f2() #self=b1 self.f2

    def f2(self):
        print(from Foo.f2)


class Bar(Foo):
    def f2(self):
        print(from Bar.f1)

        
b1 = Bar()
b1.f1()

结果:

from Foo.f1
from Bar.f1

  当b1调用f1的时候,发现自己没有,同时自己所在的类中也没有f1(),就在父类Foo中查找,显然,Foo中有f1()。所以就运行,结果为from Foo.f1。而接着就是运行self.f2(),在b1 中没有f2(),但是在对象b1所在的类中有f2(),所以运行结果就是from Bar.f2

 

继承的 实现:

对于在继承过程中,python会计算出一个方法解析顺序(MRO)列表,它是一个简单的所有基类的线性列表>

class Foo:
    pass


class Aor:
    pass


class Bar(Foo,Aor):
    pass


print(Bar.__mro__)

通过__mro__方法可以找出继承顺序:

(<class ‘__main__.Bar‘>, <class ‘__main__.Foo‘>, <class ‘__main__.Aor‘>, <class ‘object‘>)

MRO列表遵循如下三点:

1.子类优先父类被检查。

2.多个父类会根据它们在列表中的顺序被检查

3.如果对下一个类存在两个合法的选择(遵循2条件)

 

存在多个父类的情况下:

属性查找方式有:深度优先和广度优先。

一般来讲,经典类在多继承的情况下会按照深度优先的方式查找,新式类会按照广度优先的方式查找.

在python3中都是新式类,因为他们默认继承object

Bar.__bases__得到父类。

 

在新式类中:

如果,没有共同的头部类型

 

技术分享图片

查找顺序:ClassA>ClassB>ClassC>ClassD>ClassE>ClassF>object

当有共同头部父类的类型时:

技术分享图片

查找顺序:ClassA>ClassB>ClassC>ClassE>ClassF>ClassF>ClassG>ClassD>object

 

子类调用父类的方法(内置函数super):

class People:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def foo(self):
        print(from parent)

class Teacher(People):
    def __init__(self,name,age,sex,salary,level):
        #在python3中
        super().__init__(name,age,sex) #调用父类的__init__的功能,实际上用的是绑定方法,用到了mro表查询继承顺序,只能调用一个父类的功能
        #在python2中
        # super(Teacher,self).__init__(name,age,sex)    #super(Teacher,self)是一个死格式
        self.salary=salary
        self.level=level
    def foo(self):
        super().foo()
        print(from child)

t=Teacher(bob,18,male,3000,10)
print(t.name,t.age,t.sex,t.salary,t.level)
t.foo()

 





以上是关于面向对象的三大特征之一:继承的主要内容,如果未能解决你的问题,请参考以下文章

Java面向对象三大特征之继承和多态

Java面向对象编程三大特征 - 多态

三大特性:封装,继承,多态

java面向对象的三大特征?

Java面向对象之继承

面向对象编程继承