Python 继承
继承是面向对象编程方法中最重要的特性之一。它通常在使用诸如Java、PHP、Python等许多语言进行软件开发过程中使用。
您可以通过在新类名称后的括号中列出父类来创建一个类,而不是从头开始。
如果您需要设计一个新类,其中大部分属性在现有类中已经很好地定义了,那么为什么要重新定义它们呢?继承允许重复使用现有类的能力,并在需要时扩展以设计新的类。
当一个新类与现有类具有“IS A”关系时,继承就发挥作用。汽车是一种车辆,公交车也是一种车辆;自行车也是一种车辆。这里的父类是车辆,而汽车、公交车和自行车是子类。
语法
派生类的声明方式与其父类类似;但是,在类名后面要给出要继承的基类列表 –
class SubClassName (ParentClass1[, ParentClass2, ...]):
'Optional class documentation string'
class_suite
示例
class Parent: # define parent class
def __init__(self):
self.attr = 100
print ("Calling parent constructor")
def parentMethod(self):
print ('Calling parent method')
def set_attr(self, attr):
self.attr = attr
def get_attr(self):
print ("Parent attribute :", self.attr)
class Child(Parent): # define child class
def __init__(self):
print ("Calling child constructor")
def childMethod(self):
print ('Calling child method')
c = Child() # instance of child
c.childMethod() # child calls its method
c.parentMethod() # calls parent's method
c.set_attr(200) # again call parent's method
c.get_attr() # again call parent's method
输出
当您执行此代码时,它将产生以下输出−
Calling child constructor
Calling child method
Calling parent method
Parent attribute : 200
Python – 多重继承
在Python中,多重继承允许你基于多个父类构建一个类。因此,子类继承了所有父类的属性和方法。子类可以重写来自任何父类的方法。
语法
class parent1:
#statements
class parent2:
#statements
class child(parent1, parent2):
#statements
Python的标准库中有一个内置的divmod()函数,它返回一个包含两个元素的元组。第一个元素是两个参数的商,第二个元素是两个操作数的模值。
示例
这个示例试图模拟divmod()函数。我们定义了两个类division和modulus,然后有一个继承它们的div_mod类。
class division:
def __init__(self, a,b):
self.n=a
self.d=b
def divide(self):
return self.n/self.d
class modulus:
def __init__(self, a,b):
self.n=a
self.d=b
def mod_divide(self):
return self.n%self.d
class div_mod(division,modulus):
def __init__(self, a,b):
self.n=a
self.d=b
def div_and_mod(self):
divval=division.divide(self)
modval=modulus.mod_divide(self)
return (divval, modval)
子类有一个新的方法div_and_mod(),该方法内部调用其继承类的divide()和mod_divide()方法来返回除法和求余值。
x=div_mod(10,3)
print ("division:",x.divide())
print ("mod_division:",x.mod_divide())
print ("divmod:",x.div_and_mod())
输出
division: 3.3333333333333335
mod_division: 1
divmod: (3.3333333333333335, 1)
方法解析顺序(MRO)
术语“方法解析顺序”与Python中的多重继承有关。在Python中,继承可能分布在多个层级上。假设A是B的父类,B是C的父类。类C可以重写继承的方法,或者其对象可以按照其父类中定义的方式调用它。那么,Python如何找到适当的方法进行调用。
每个Python类都有一个mro()方法,该方法返回Python解析要调用的方法的层次顺序。解析顺序是从继承顺序的底部到顶部。
在我们以前的例子中,div_mod类继承了division和modulus类。因此,mro方法返回的顺序如下 –
[<class '__main__.div_mod'>, <class '__main__.division'>, <class '__main__.modulus'>, <class 'object'>]