📅  最后修改于: 2020-09-19 13:57:52             🧑  作者: Mango
继承是面向对象编程中的一项强大功能。
它指的是定义一个新类,而对现有类的修改很少或没有修改。新类称为派生类(子类) ,而继承的新类称为基类(或父类) 。
class BaseClass:
Body of base class
class DerivedClass(BaseClass):
Body of derived class
派生类从基类继承功能,可以在其中添加新功能。这导致代码的可重用性。
为了演示继承的使用,让我们举一个例子。
多边形是具有3个或更多边的闭合图形。假设我们有一个名为Polygon
的类,定义如下。
class Polygon:
def __init__(self, no_of_sides):
self.n = no_of_sides
self.sides = [0 for i in range(no_of_sides)]
def inputSides(self):
self.sides = [float(input("Enter side "+str(i+1)+" : ")) for i in range(self.n)]
def dispSides(self):
for i in range(self.n):
print("Side",i+1,"is",self.sides[i])
此类具有数据属性,用于存储边数n
和每边的大小作为称为sides
的列表。
inputSides()
方法采用每侧的大小,并且dispSides()
显示这些侧边的长度。
三角形是具有3个边的多边形。因此,我们可以创建一个称为Triangle
的类,该类继承自Polygon
。这使得Polygon
类的所有属性可用于Triangle
类。
我们不需要再次定义它们(代码可重用性)。 Triangle
可以定义如下。
class Triangle(Polygon):
def __init__(self):
Polygon.__init__(self,3)
def findArea(self):
a, b, c = self.sides
# calculate the semi-perimeter
s = (a + b + c) / 2
area = (s*(s-a)*(s-b)*(s-c)) ** 0.5
print('The area of the triangle is %0.2f' %area)
但是,类Triangle
具有新方法findArea()
来查找和打印三角形的区域。这是一个示例运行。
>>> t = Triangle()
>>> t.inputSides()
Enter side 1 : 3
Enter side 2 : 5
Enter side 3 : 4
>>> t.dispSides()
Side 1 is 3.0
Side 2 is 5.0
Side 3 is 4.0
>>> t.findArea()
The area of the triangle is 6.00
我们可以看到,即使我们没有为Triangle
类分别定义诸如inputSides()
或dispSides()
类的方法,我们仍然可以使用它们。
如果在类本身中找不到属性,则搜索继续到基类。如果基类本身是从其他类派生的,则将递归重复此操作。
在上面的示例中,请注意,在Triangle
和Polygon
这两个类中都定义了__init__()
方法。发生这种情况时,派生类中的方法将覆盖基类中的方法。这就是说, Triangle
__init__()
优于Polygon
的__init__
。
通常,当覆盖基本方法时,我们倾向于扩展定义而不是简单地替换它。通过从派生类中的基类中调用基类中的方法Polygon.__init__()
从Triangle
__init__()
中调用Polygon.__init__()
)来完成相同的操作。
更好的选择是使用内置函数 super()
。因此, super().__init__(3)
等效于Polygon.__init__(self,3)
并成为首选。要了解有关Python的super()
函数的更多信息,请访问Python super() 函数。
两个内置函数isinstance()
和issubclass()
用于检查继承。
如果对象是该类或从其派生的其他类的实例,则函数 isinstance()
返回True
。 Python的每个类都从基类object
继承。
>>> isinstance(t,Triangle)
True
>>> isinstance(t,Polygon)
True
>>> isinstance(t,int)
False
>>> isinstance(t,object)
True
同样, issubclass()
用于检查类的继承。
>>> issubclass(Polygon,Triangle)
False
>>> issubclass(Triangle,Polygon)
True
>>> issubclass(bool,int)
True