天天看点

python面向对象 封装继承多态 示例

需求

定义一个图形管理器

功能1:保存所有图形

功能2:图形管理器提供计算所有图形总面积的功能,如能够计算:圆形 pi*r**2,矩形 长 * 宽

且要求增加新图形时,不影响图形管理器代码

#定义一个图形管理器类
class GraphicManager:
	def __init__(self):
		#存放所有图形
		self.__list_graphic = []

	#功能:让用户查看所有图形类别,只读
	@property
	def list_graphic(self):
		return self.__list_graphic
	
	#功能1:向列表中存放各种图形
	def add_graphic(self,graphic):
		#如果图形不是由图形父类创建出来的,引起异常
		if not isinstance(graphic,Graphic):
			raise ValueError()
		else:
			self.__list_graphic.append(graphic)	#列表append()方法
	
	#功能2:计算总面积
	def calc_total_area(self):
		total_area = 0
		for item in self.__list_graphic:
			total_area += item.calc_area()
			return total_area

#定义一个图形父类(体现继承,依赖倒置)
class Graphic:
	#功能:计算面积,怎么实现不需要写,让子类自己去泛化
	def calc_area(self):
		#确保子类重写父类的该方法,如果子类没有重写父类的这个方法,就会抛出异常
		raise NotImplementedError()

#定义图形子类 -- 圆形
class Circle(Graphic):	#继承自父类
	def __init__(self,radius):
		#实例变量radius:半径
		self.radius = radius
		
	#重写父类的计算面积方法(体现多态)
	def calc_area(self):
		area = 3.14 * self.radius ** 2
		
#定义图形子类 -- 矩形
class Rectangle(Graphic):
	def __init__(self,length,width):
		self.length = length
		self.width = width
	
	#重写父类计算面积的方法
	def calc_area(self):
		return self.length * self.width

c01 =Circle(5)
r01 = Rectangle(10,20)
manager = GraphicManager()
manager.add_graphic(c01)	#类与类的组合使用
manager.add_graphic(r01)
print(manager.list_graphic)

print(manager.calc_total_area())