python深入之语音播报计算器设计

代码一:普通函数调用

def jia(m, n):
    return m + n
def jian(m, n):
    return m - n
def cheng(m, n):
    return m * n
print(jia(1, 2))
print(jian(3, 2))
print(cheng(4, 5))

每次传入两个数值,调用相关函数进行计算,并输出结果

代码二:面向用户的连续计算,给定初值,每次调用相关函数,输入一个数值

result = 0
def fuzhi(n):
    global result
    result = n
def jia(n):
    global result
    result += n
    return result
def jian(n):
    global result
    result -= n
    return result
def cheng(n):
    global result
    result *= n
    return result
fuzhi(10)
print(jia(5))
print(jian(5))
print(cheng(5))

定义全局变量,对其进行连续操作(10 + 5 - 5) * 5,得出最终结果50

代码三:将函数和初值封装到类中,此时,初值变成类属性,并且不希望其在外面被修改,将其私有化;函数编程类方法

class Calculator(object):
    __result = 0
    @classmethod
    def jia(cls, n):
        cls.__result += n
        return cls.__result
    @classmethod
    def jian(cls, n):
        cls.__result -= n
        return cls.__result
    @classmethod
    def cheng(cls, n):
        cls.result *= n
        return cls.__result
    @classmethod
    def getRes(cls):
        return cls.__result
Calculator.jia(5)
Calculator.jian(2)
Calculator.cheng(2)
print(Calculator.getRes())

使用类来调用相关方法,实现各种计算,并调用输出方法来访问私有属性,输出结果

代码四:由于类属性依赖于类,当该类同时被几次应用时,最终计算结果就会出错,这里将类属性变成实例属性,每个计算实例相互独立;并且加入检查机制,输入必须是整数

class Calculator(object):
    def __check_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError("输入数据必须是整数,请重新输入")
            return func(self, n)
        return inner
    @__check_zsq
    def __init__(self, num):
        self.__result = num
    @__check_zsq
    def jia(self, n):
        self.__result += n
        return self.__result
    @__check_zsq
    def jian(self, n):
        self.__result -= n
        return self.__result
    @__check_zsq
    def cheng(self, n):
        self.__result *= n
        return self.__result
    def getRes(self):
        return self.__result
c1 = Calculator(10)
c1.jia(5)
c1.jian(6)
c1.cheng(2)
print(c1.getRes())

这里添加了检查机制,由于每个计算操作都要加入次机制代码,为了不破坏方法的单一职责原则,将检查机制做成装饰器,然后对每个方法进行装饰即可

代码五:加入语音播报功能;使用property来关联获取操作;加入清零操作

import win32com.client
class Calculator(object):
    def __speak(self, n):
        # 创建语音对象
        speak = win32com.client.Dispatch("SAPI.SpVoice")
        # 播报内容
        speak.Speak(n)
    def __say(char=""):
        def __speak_zsq(func):
            def inner(self, n):
                self.__speak(char + str(n))
                return func(self, n)
            return inner
        return __speak_zsq
    def __check_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError("输入数据必须是整数,请重新输入")
            return func(self, n)
        return inner
    @__check_zsq
    @__say()
    def __init__(self, num):
        self.__result = num
    @__check_zsq
    @__say("加上")
    def jia(self, n):
        self.__result += n
        return self
    @__check_zsq
    @__say("减去")
    def jian(self, n):
        self.__result -= n
        return self
    @__check_zsq
    @__say("乘以")
    def cheng(self, n):
        self.__result *= n
        return self
    def speak_res(self):
        self.__speak("等于%d" % self.__result)
        return self
    @property
    def getRes(self):
        return self.__result
    def clear(self):
        self.__speak("清零")
        self.__result = 0
        return self
c1 = Calculator(10)
c1.jia(5).jian(1).cheng(25).speak_res().clear().jia(20).cheng(10).speak_res()
print(c1.getRes)

每个方法的操作名称需要在使用时进行播报,所以将播报方法做成返回装饰器的方法,再将各种操作名称传入播报即可;由于关联了获取操作,输出时只需使用属性来表示方法调用;清零操作可使计算器多次使用;由于方法都是实例方法,每次调用都要使用该实例,为了简化,在每个方法最后返回该实例,就可以将方法的调用写成链式形式,即c1.jia(5).jian(1).cheng(25).speak_res().clear().jia(20).cheng(10).speak_res() 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值