面向对象的三大特征之一:继承
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()
以上是关于面向对象的三大特征之一:继承的主要内容,如果未能解决你的问题,请参考以下文章