Python面向对象编程:继承与组合的实战应用解析
本文深入解析Python面向对象编程中继承与组合两种核心机制。通过圆环计算示例演示组合用法,以类层级结构说明继承原理,涵盖单继承、多继承、抽象概念及方法重写技巧。详细讲解如何利用super()和类名调用父类方法,帮助开发者掌握代码重用与类关系设计的最佳实践。
本文通过具体实例详细解析Python面向对象编程中继承与组合的应用方法,旨在为读者提供清晰的参考指南。
面向对象的组合用法
在软件工程中,除了继承之外,实现代码重用的另一种重要手段是组合。
组合的定义在于:在一个类内部,将另一个类的实例作为数据属性进行存储,这种设计模式被称为类的组合。
以圆环为例,其结构由两个同心圆构成。圆环的面积等于外圆面积减去内圆面积,而圆环的周长则是外圆周长与内圆周长之和。
基于上述逻辑,我们首先定义一个计算圆形周长和面积的圆形类,随后在环形类中通过组合圆形类的实例作为自身属性来实现功能。
# -*-coding:utf-8 -*-
#! python3
from math import pi
class Circle:
'''
定义了一个圆形类;
提供计算面积(area)和周长(perimeter)的方法
'''
def __init__(self,radius):
self.radius = radius
def area(self):
return pi * self.radius * self.radius
def perimeter(self):
return 2 * pi *self.radius
circle = Circle(10) #实例化一个圆
area1 = circle.area() #计算圆面积
per1 = circle.perimeter() #计算圆周长
print(area1,per1) #打印圆面积和周长
class Ring:
'''
定义了一个圆环类
提供圆环的面积和周长的方法
'''
def __init__(self,radius_outside,radius_inside):
self.outsid_circle = Circle(radius_outside)
self.inside_circle = Circle(radius_inside)
def area(self):
return self.outsid_circle.area() - self.inside_circle.area()
def perimeter(self):
return self.outsid_circle.perimeter() + self.inside_circle.perimeter()
ring = Ring(10,5) #实例化一个环形
print(ring.perimeter()) #计算环形的周长
print(ring.area()) #计算环形的面积
运行结果如下所示:
314.1592653589793 62.83185307179586 94.24777960769379 235.61944901923448
继承
继承是创建新类的一种机制。在Python中,新建的类可以继承一个或多个父类(也称为基类或超类),而新建的类则被称为派生类或子类。
Python中的类继承主要分为单继承和多继承两种形式。
查看继承关系
>>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类 (<class '__main__.ParentClass1'>,) >>> SubClass2.__bases__ (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)
注意:若未显式指定基类,Python类默认继承object类。object是所有Python类的基类,它提供了如__str__等常见方法的实现。
>>> ParentClass1.__bases__ (<class 'object'>,) >>> ParentClass2.__bases__ (<class 'object'>,)
继承与抽象(先抽象再继承)
抽象是指抽取事物相似或相近的部分。
抽象过程分为两个层次:
1. 将奥巴马和梅西这两个对象中相似的部分提取并封装为类;
2. 将人、猪、狗这三个类中相似的部分提取并封装为父类。
抽象的核心作用在于划分类别,从而隔离关注点并降低系统复杂度。
继承是基于抽象结果的具体实现。编程语言通过继承来表达抽象结构,因此必须先经过抽象过程,才能通过继承方式展现抽象形态。
抽象仅是分析与设计过程中的一个动作或技巧,通过抽象可以生成类。
继承与重用性
在程序开发中,若已定义类A,现需新建类B,且类B的大部分功能与类A相同。
此时无需从头编写类B,而是利用类的继承概念来解决。
通过让类B继承类A,B将“遗传”A的所有属性(包括数据属性和函数属性),从而实现代码重用。
派生
子类可以添加新属性或在自身范围内重新定义属性(这不会影响父类)。需注意,一旦重新定义了与父类同名的属性,调用时将优先使用子类的定义。
在子类中,若新建的重名函数需要重用父类中同名函数的功能,应采用普通函数调用方式,即:类名.func()。此时调用方式与普通函数无异,因此即使涉及self参数,也需显式传值。
在Python 3中,子类执行父类方法也可直接使用super方法。
# -*-coding:utf-8 -*-
#! python3
class A:
def hahaha(self):
print('A')
class B(A):
def hahaha(self):
super().hahaha()
#super(B,self).hahaha()
#A.hahaha(self)
print('B')
a = A()
b = B()
b.hahaha()
super(B,b).hahaha()
运行结果如下:
A B A
通过继承建立了派生类与基类之间的“是”关系,例如白马是马,人是动物。
当多个类具有大量相同功能时,将这些共同功能提取为基类并使用继承是较好的选择,例如教授是老师。
对Python相关内容感兴趣的读者可参考本站专题:《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》。
希望本文所述内容能对大家的Python程序设计学习有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









