1,继承的基本概念
继承是非常重要的,因为继承让我们能够延续以前的东西,“继承”意味着一个人从另外一个人那里得到了一些什么。
继承”,跟通常理解的继承会有所不同。“继承”在高级编程语言中是一个非常重要的概念。虽然不用继承一样能够编写程序,但是,当我们追求程序的更高阶层时,继承的作用就显现出来了。
子类别”,而把B称为“A的 父类别”,也可以称“B是A的 超类”。
继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。
继承的意图或者好处:
代码重用,但不是仅仅实现代码重用,有时候根本就没有重用。
(2)实现属性和方法继承。
多态。对于多态而言,重要的是接口继承性,属性和行为是否存在继承性,这是不一定的。
在Python里,因为存在Duck Type,接口定义的重要性大大降低,继承的作用也进一步被削弱了。
另外,从逻辑上说,继承的目的也不是为了复用代码,而是为了理顺关系。
#! /usr/bin/env python
# coding=utf-8
__metaclass__ = type
class Person:
def speak(self):
print "I love you."
def setHeight(self):
print "My height is:1.65m."
def breast(self,n):
print "My breast is:",n
class Girl(Person):
def setHeight(self):
print "The height is:1.80m."
if __name__ == "__main__":
c = Girl()
c.setHeight()
c.speak()
c.breast(80)
运行结果是:
>>>
The height is:1.80m.
I love you.
My breast is: 80
初始化函数在类中 不是必须的。
继承了Person,girl是Person的 子类,Person是girl的 父类。
继承了Person,那么girl就拥有了Person中的 全部方法和属性。但是,如果girl里面有一个和Person同样名称的方法,那么就把Person中的同一个方法遮盖住了,显示的是girl中的方法,这叫作方法的 重写。
重写了setHeight方法,那么Person中的那个方法就不显作用了,在这个实例方法中执行的是类girl中的setHeight方法。
虽然在类girl中没有看到speak方法,但是因为它继承了Person,所以c.speak()就执行类Person中的方法。同理c.breast(80),它们就好像是在类girl里面已经写了这两个方法一样。
2,多重继承
多重继承就是指某一个类所继承的父类,不止一个,而是多个。
#! /usr/bin/env python
# coding=utf-8
__metaclass__ = type
class Person:
def eye(self):
print "one eyes"
def breast(self,n):
print "My breast is:",n
class Girl:
age = 20
def color(self):
print "The girl is white"
class HotGirl(Person,Girl):
pass
if __name__ == "__main__":
k = HotGirl()
k.eye()
k.breast(80)
k.color()
print k.age
继承了这两个类,注意观察继承方法,就是在类的名字后面的括号中把所继承的两个类的名字写上。
然后实例化类HotGirl,既然继承了上面的两个类,那么那两个类的方法就都能够拿过来使用。
运行结果:
>>>
one eyes
My breast is: 80
The girl is white
20
在类girl中,有一个age=28,在对HotGirl实例化之后,因为继承的原因,这个类属性也被继承到HotGirl中,因此通过实例属性k.age一样能够得到该数据。
多重继承执行的顺序:
#! /usr/bin/env python
# coding=utf-8
__metaclass__ = type
class Person:
def eye(self):
print "one eyes"
def breast(self,n):
print "My breast is:",n
class Girl:
age = 20
def color(self):
print "The girl is white"
def eye(self):
print "two eye"
class HotGirl(Person,Girl):
pass
if __name__ == "__main__":
k = HotGirl()
k.eye()
k.breast(80)
k.color()
print k.age
运行结果:
>>>
one eyes
My breast is: 80
The girl is white
20
如果要执行eye()方法,首先看Person,有了就执行,即HotGirl==>Person==>Girl;breast(80)和color()也是按照这个顺序,找到了一个就不会往下找了。
广度优先”。
在新式类中,以及python3.x的类中,都是按照“广度优先”原则搜寻属性和方法的。
3,super函数
初始化函数的继承跟一般方法的继承还有点不同,因为在子类中重写了某个方法之后,父类中同样的方法被遮盖了,那么如何再把父类的该方法调出来使用呢?
#! /usr/bin/env python
# coding=utf-8
__metaclass__ = type
class Person:
def __init__(self):
self.height = 150
def about(self,name):
print "{} is about {}".format(name,self.height)
class HotGirl(Person):
def __init__(self):
super(HotGirl,self).__init__() #重写之后调用父类初始化方法
self.breast = 90
def about(self,name):
print "{} is a hot girl,she is about {},and her break is {}".format(name,self.height,self.breast)
super(HotGirl,self).about("zhangsan") #重写之后调用父类方法
if __name__ == "__main__":
k = HotGirl()
k.about("kity")
super(Girl,self).__init__()的方式。super函数的参数,第一个是当前子类的类名字,第二个是self,然后是点号,点号后面是所要调用的父类的方法。同样在子类重写的about方法中,也可以调用父类的about方法。
执行结果:
>>>
kity is a hot girl,she is about 150,and her break is 90
zhangsan is about 150
super函数仅仅适用于新式类。
如果你用的是Python3.x,则使用super函数的形式稍微不同。自己查看下API