今天翻了之前的python面向对象的基础案例,发现一个很有趣的需求。差不多涵盖了面向对象的所有知识点。先记录一下。
需求:
题目:品尝饮料
1. 当输入 咖啡时,控制台显示:咖啡:苦2. 如果没有该种饮料,控制台显示: 对不起!没有您输入的饮料类型。
推荐实现步骤:
1、建立一个python类Drink,应当做如下:
a、声明一个方法taste(),该方法负责输出饮料的味道;
2、建立Drink的具体子类:
a、分别建立Drink的子类:Coffee(代表咖啡),Beer(代表啤酒),Milk(代表牛奶);
b、实现taste()方法,要求在控制台打印各自的味道特征。3、建立异常类DrinkNotFoundException
a、继承Exception
b、在Drink的方法getDrink(int drinkType)中声明引发DrinkNotFoundException异常,当传入的参数没有相对应的饮料类型时,抛出异常。
c、在使用getDrink方法的类中捕捉该异常。4、建立Test测试模块,测试以上内容的正确性:
声明一个方法getDrink(),该方法负责输出饮料的类型
a、编写main方法,通过命令行传参的方式传入某种饮料的类型。
b、在main方法中,调用getDrink方法,获得相应的饮料对象。注意捕获DrinkNotFoundException。
c、然后调用该饮料对象的taste()方法,输出该饮料的味道。
5、编译程序,并运行。
涉及到的知识点:
- 类的创建与函数的定义
- 继承关系,函数的重写特性
- 简单工厂模式
- 自定义异常,异常的捕获与抛出
实现代码:
class DrinkNotFoundException(Exception):
def __init__(self,value):
self.__value = value
def __str__(self):
return repr(self.__value)
class Drink(object):
def taste(self):
return
class Coffee(Drink):
def taste(self):
return '咖啡:苦'
class Beer(Drink):
def taste(self):
return '啤酒:爽'
class Milk(Drink):
def taste(self):
return '牛奶:甜'
# 简单工厂模式 传入一个int或者是字符串类型的参数,可以根据判断,得到某一个类子类当中对应的对象。
# 减轻了调用者的难度,可以通过某一个条件直接返回对象。
# 缺点:后期增加新的饮品时就需要对于方法进行新的升级和改版,在python当中改版升级可以使用装饰器
# 比如 :果果饮料城又有了新产品,果汁-4 返回果汁的对象 使用装饰器怎样完成。
def getDrink(drinktype):
if drinktype == '1':
return Coffee()
elif drinktype =='2':
return Beer()
elif drinktype =='3':
return Milk()
else:
raise DrinkNotFoundException('对不起,没有相应的饮品!')
if __name__ == '__main__':
# 传入int类型的数据获取到响应的对象
while True:
print('请输入您需要的饮品的类型,咖啡-1,啤酒-2,牛奶-3,退出-0')
type = input()
if type == '0':
print('感谢您的使用,谢谢购买!!')
break
try:
d = getDrink(type)
print(d.taste())
except DrinkNotFoundException as e:
print(e)
代码虽简单,但是涉及知识比较广,能够作为面向对象的综合案例题目。
感谢您的阅读~