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 中的多重继承允许您基于多个父类构造一个类。因此,Child 类继承了所有父类的属性和方法。子级可以重写从任何父级继承的方法。

句法

class parent1:
   #statements
   
class parent2:
   #statements
   
class child(parent1, parent2):
   #statements

Python 的标准库有一个内置的 divmod() 函数,它返回一个二项元组。第一个数字是两个参数的除法,第二个数字是两个操作数的 mod 值。

例子

此示例尝试模拟 divmod() 函数。我们定义两个类 除法 和 模数 ,然后有一个继承它们的 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() 方法以返回除法和 mod 值。

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 类继承了除法和模数类。因此, mro 方法返回的顺序如下 -

[<class '__main__.div_mod'>, <class '__main__.division'>, <class '__main__.modulus'>, <class 'object'>]