类的继承是类使用的灵魂,没有继承的类是不完整的,继承也是面对对象类语言的一个显著特点。python中支持多级继承,即类继承是可以一级一级地传递的,在多级继承的过程中依照的顺序是MRO(Method resolution order)顺序来进行继承属性和方法的,不过本文不会涉及到那么复杂的多级继承啦。本文就简单介绍一下类继承的使用方式就好了!
附上类使用专栏的其它文章的链接:
- python 类的使用(1) 之类使用的基本框架
- python 类的使用(2) 之类变量
- python 类的使用(3)之类中常用的三个装饰器@classmethod、@staticmethod、@property
- python 类的使用(4)之类常用的魔法方法
- python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)
- python 类的使用(6)之类的继承
- python 类的使用(7)之类的私有属性和方法 (类中以单下划线或双下划线开头的变量名或函数名)
继承是什么?
在电视剧中我们常听到“继承遗产”这样的词语,其实类中的继承也与这里的意思很相似,就是直接去承接别人所拥有的某些东西。类中的继承是用来创建新类的,其从已经存在的类中获得方法及属性用于新类中,在新类中可以再定义额外的方法或属性,从而新类变成了相对之前的类而言更加特殊的类,完成了从一般到特殊的转变。
在类的继承中,被继承的类叫做“父类”、“基类”或“超类”,由继承产生的类被叫做“子类”或“派生类”。在类的继承中,由于父类中已经包含了某些属性及方法,继承所产生的新类若是不作特定修改的话那么父类所拥有的那些属性及方法就会被子类直接继承,而不用在子类中重写,也正是因此类的继承是现实应用中非常有用的功能。
比如我写一个哺乳动物的父类,我可以再写更明确的某些哺乳动物的子类,这样的子类可以是猫猫、狗狗等。写在代码中就是这样:
class Mammals:
def __init__(self, name):
self.name = name
def has_hair(self):
print("{} has hair".format(self.name))
class horse(Mammals): # 要继承某个类直接在括号中加上父类名即可
pass # 由于此处在子类中未写任何内容,因此子类将继承父类所有属性和方法。
a = horse('Bailongma') # 创建一个子类的类实例
print(a.name) # 子类继承来的属性
a.has_hair() # 子类继承来的方法
'''
运行结果:
Bailongma
Bailongma has hair
'''
子类对父类属性和方法的继承和发扬!
在了解到继承是什么之后,要知道继承肯定不是完全一模一样的去继承父类,否则创建新类就没有意义了。我认为要创建一个有用的子类需要的可能是增添、删除或者修改某些父类中的类属性以及类方法,这样也就能达到不复写代码的效果。
首先是对类属性的继承,类属性对于类来说一般有两个来源,一个是在类中未被包含在任何函数内的直接写下的赋值语句;另一个就是来源于类构造函数__init__,对于第一种来源的类属性,直接在新类中重新写下一条赋值语句覆盖之前的变量即可,对于第二种的类属性就稍稍麻烦一点了,可以在新类的__init__构造函数中使用以下两种方式继承父类的属性。
# 1.
# 父类名.__init__(self, 属性1、属性2、。。。)
# 2.
# super.__init__(属性1、属性2、。。。)
接下来是对于类方法的继承,父类中的某些类方法可能是我们需要保留的,但某些可能是我们不需要的或者是需要重写的,这种情况下只要在子类中重写这些需要修改的类方法即可。另外创建新类后还可以增加新的类方法。
属性及方法继承的例子:
class Mammals:
def __init__(self, name, life_span):
self.name = name
self.life_span = life_span
def has_hair(self):
print("{} has hair".format(self.name))
def print_age(self):
print("{} can live for {} years".format(self.name, self.life_span))
class horse(Mammals):
def __init__(self, name, life_span, height, speed):
Mammals.__init__(self, name, life_span) # 继承属性
# 这样的语句的效果就是能够从父类中将这些属性继承过来
# 这里是单继承,使用super.__init__(name, life_span)也可以,
# 单继承时使用super的效果和普通方式一样,但在多重继承时就需要用到super了,
# 其能够根据MRO顺序完成对多个父类进行继承。
self.height = height
self.speed = speed
def has_hair(self): # 这里我觉得父类的方法不好,就重写一下
return True
def describe(self): # 新写一个函数,增添子类的功能
print("{} is {} meters tall and runs {} meters per second".\
format(self.name, self.height, self.speed))
A = horse('Bailongma', '100', '2.00', '10')
A.print_age() # 这里继承父类的函数未在子类中修改,所以还是可以直接调用的
print(A.has_hair()) # 这里子类修改了父类已经存在的函数,所以运行结果根据修改后的函数得到的
A.describe() # 这里是子类的新功能
'''
运行结果:
Bailongma can live for 100 years
True
Bailongma is 2.00 meters tall and runs 10 meters per second
'''
例子中包含了属性的继承和新属性的创建,还有类方法的重构,类方法的新建,可以多多理解一下呀!
叮!
本文就简单介绍了一下类的继承的基本使用方式,只涉及到了类的单继承,多重继承较为复杂,并未涉及到。希望能帮助到大家!
参考:python类的继承