Python 面向对象 小节案例

计算器

通过类属性的方式:

# 计算器 实现一些基本操作,加减乘除运算,以及打印结果操作

class Caculator:
    __result = 0

    @classmethod
    def first_value(cls, v):
        cls.__result = v
    
    @classmethod
    def jia(cls, n):
        cls.__result += n
    
    @classmethod
    def jian(cls, n):
        cls.__result -= n

    @classmethod
    def cheng(cls, n):
        cls.__result *= n
    
    @classmethod
    def show(cls):
        print('计算的结果是:%d' % cls.__result)

Caculator.first_value(2)
Caculator.jia(6)
Caculator.jian(4)
Caculator.cheng(5)
Caculator.show()

通过对象属性:

# 计算器 实现一些基本操作,加减乘除运算,以及打印结果操作

class Caculator:
    def __init__(self, num):
        self.__result = num
    
    def jia(self, n):
        self.__result += n
    
    def jian(self, n):
        self.__result -= n

    def cheng(self, n):
        self.__result *= n
    
    def show(cls):
        print('计算的结果是:%d' % cls.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

增加容错处理:

# 计算器 实现一些基本操作,加减乘除运算,以及打印结果操作

class Caculator:
    def check_num(self, num):
        if not isinstance(num,int):
            raise TypeError()
            # raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')


    def __init__(self, num):
        self.check_num(num)
        self.__result = num
    
    def jia(self, n):
        self.check_num(n)
        self.__result += n
    
    def jian(self, n):
        self.check_num(n)
        self.__result -= n

    def cheng(self, n):
        self.check_num(n)
        self.__result *= n
    
    def show(cls):
        print('计算的结果是:%d' % cls.__result)

c1 = Caculator('a')
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

修改为方法的单一职责(装饰器设计模式):

# 计算器 实现一些基本操作,加减乘除运算,以及打印结果操作

class Caculator:
    def check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner

    @check_num_zsq
    def __init__(self, num):
        self.__result = num
    
    @check_num_zsq
    def jia(self, n):
        self.__result += n
    
    @check_num_zsq
    def jian(self, n):
        self.__result -= n

    @check_num_zsq
    def cheng(self, n):
        self.__result *= n
    
    def show(cls):
        print('计算的结果是:%d' % cls.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

装饰器方法由实例方法,变为私有方法:

# 计算器 实现一些基本操作,加减乘除运算,以及打印结果操作

class Caculator:
    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner

    @__check_num_zsq
    def __init__(self, num):
        self.__result = num
    
    @__check_num_zsq
    def jia(self, n):
        self.__result += n
    
    @__check_num_zsq
    def jian(self, n):
        self.__result -= n

    @__check_num_zsq
    def cheng(self, n):
        self.__result *= n
    
    def show(cls):
        print('计算的结果是:%d' % cls.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

添加语音
pip install pypiwin32

import win32com.client

# 1 创建一个播放器对象
speaker = win32com.client.Dispatch("SAPI.SpVoice")

# 2 通过这个播报器对象,播报相对应的语音字符串
speaker.Speak('王磊阳 你好')
import win32com.client


# 1 创建一个播放器对象
speaker = win32com.client.Dispatch("SAPI.SpVoice")

# 2 通过这个播报器对象,播报相对应的语音字符串
speaker.Speak('你好')

class Caculator:
    def __say(self, word):
        # 1 创建一个播放器对象
        speaker = win32com.client.Dispatch("SAPI.SpVoice")

        # 2 通过这个播报器对象,播报相对应的语音字符串
        speaker.Speak(word)


    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner

    @__check_num_zsq
    def __init__(self, num):
        self.__say(num)
        self.__result = num
    
    @__check_num_zsq
    def jia(self, n):
        self.__say(n)
        self.__result += n
    
    @__check_num_zsq
    def jian(self, n):
        self.__say(n)
        self.__result -= n

    @__check_num_zsq
    def cheng(self, n):
        self.__say(n)
        self.__result *= n
    
    def show(self):
        self.__say('计算的结果是:%d' % self.__result)
        print('计算的结果是:%d' % self.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

装饰器的嵌套:

import win32com.client

class Caculator:
    def __say_zsq(func):
        def inner(self, n):
            # 1 创建一个播放器对象
            speaker = win32com.client.Dispatch("SAPI.SpVoice")

            # 2 通过这个播报器对象,播报相对应的语音字符串
            speaker.Speak(n)
            return func(self, n)
        return inner

    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner

    @__check_num_zsq
    @__say_zsq
    def __init__(self, num):
        self.__result = num
    
    @__check_num_zsq
    @__say_zsq
    def jia(self, n):
        self.__result += n
    
    @__check_num_zsq
    @__say_zsq
    def jian(self, n):
        self.__result -= n

    @__check_num_zsq
    @__say_zsq
    def cheng(self, n):
        self.__result *= n
    
    def show(self):
        # self.__say('计算的结果是:%d' % self.__result)
        print('计算的结果是:%d' % self.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

修改为不同的装饰器

import win32com.client

class Caculator:
    def __say_zsq_init(func):
        def inner(self, n):
            # 1 创建一个播放器对象
            speaker = win32com.client.Dispatch("SAPI.SpVoice")

            # 2 通过这个播报器对象,播报相对应的语音字符串
            speaker.Speak(n)
            return func(self, n)
        return inner

    def __say_zsq_jia(func):
        def inner(self, n):
            # 1 创建一个播放器对象
            speaker = win32com.client.Dispatch("SAPI.SpVoice")

            # 2 通过这个播报器对象,播报相对应的语音字符串
            speaker.Speak('加 %d' % n)
            return func(self, n)
        return inner

    def __say_zsq_jian(func):
        def inner(self, n):
            # 1 创建一个播放器对象
            speaker = win32com.client.Dispatch("SAPI.SpVoice")

            # 2 通过这个播报器对象,播报相对应的语音字符串
            speaker.Speak('减 %d' % n)
            return func(self, n)
        return inner

    def __say_zsq_cheng(func):
        def inner(self, n):
            # 1 创建一个播放器对象
            speaker = win32com.client.Dispatch("SAPI.SpVoice")

            # 2 通过这个播报器对象,播报相对应的语音字符串
            speaker.Speak('乘 %d' % n)
            return func(self, n)
        return inner

    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner

    @__check_num_zsq
    @__say_zsq_init
    def __init__(self, num):
        self.__result = num
    
    @__check_num_zsq
    @__say_zsq_jia
    def jia(self, n):
        self.__result += n
    
    @__check_num_zsq
    @__say_zsq_jian
    def jian(self, n):
        self.__result -= n

    @__check_num_zsq
    @__say_zsq_cheng
    def cheng(self, n):
        self.__result *= n
    
    def show(self):
        # self.__say('计算的结果是:%d' % self.__result)
        print('计算的结果是:%d' % self.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

修改为带参数的装饰器

import win32com.client

class Caculator:
    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner

    def create_say_zsq(word=''):
        def __say_zsq(func):
            def inner(self, n):
                # 1 创建一个播放器对象
                speaker = win32com.client.Dispatch("SAPI.SpVoice")

                # 2 通过这个播报器对象,播报相对应的语音字符串
                speaker.Speak(word + str(n))
                return func(self, n)
            return inner
        return __say_zsq
        

    @__check_num_zsq
    @create_say_zsq()
    def __init__(self, num):
        self.__result = num
    
    @__check_num_zsq
    @create_say_zsq('加')
    def jia(self, n):
        self.__result += n
    
    @__check_num_zsq
    @create_say_zsq('减')
    def jian(self, n):
        self.__result -= n

    @__check_num_zsq
    @create_say_zsq('乘')
    def cheng(self, n):
        self.__result *= n
    
    def show(self):
        # self.__say('计算的结果是:%d' % self.__result)
        print('计算的结果是:%d' % self.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

import win32com.client

class Caculator:
    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner


    def __say(self, word):
        # 1 创建一个播放器对象
        speaker = win32com.client.Dispatch("SAPI.SpVoice")

        # 2 通过这个播报器对象,播报相对应的语音字符串
        speaker.Speak(word)

    def __create_say_zsq(word=''):
        def __say_zsq(func):
            def inner(self, n):
                self.__say(word + str(n))
                return func(self, n)
            return inner
        return __say_zsq
        


    @__check_num_zsq
    @__create_say_zsq()
    def __init__(self, num):
        self.__result = num
    
    @__check_num_zsq
    @__create_say_zsq('加')
    def jia(self, n):
        self.__result += n
    
    @__check_num_zsq
    @__create_say_zsq('减去')
    def jian(self, n):
        self.__result -= n

    @__check_num_zsq
    @__create_say_zsq('乘以')
    def cheng(self, n):
        self.__result *= n
    
    def show(self):
        self.__say('计算的结果是:%d' % self.__result)
        print('计算的结果是:%d' % self.__result)

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()

通过描述器返回结果

import win32com.client

class Caculator:
    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner


    def __say(self, word):
        # 1 创建一个播放器对象
        speaker = win32com.client.Dispatch("SAPI.SpVoice")

        # 2 通过这个播报器对象,播报相对应的语音字符串
        speaker.Speak(word)

    def __create_say_zsq(word=''):
        def __say_zsq(func):
            def inner(self, n):
                self.__say(word + str(n))
                return func(self, n)
            return inner
        return __say_zsq
        


    @__check_num_zsq
    @__create_say_zsq()
    def __init__(self, num):
        self.__result = num
    
    @__check_num_zsq
    @__create_say_zsq('加')
    def jia(self, n):
        self.__result += n
    
    @__check_num_zsq
    @__create_say_zsq('减去')
    def jian(self, n):
        self.__result -= n

    @__check_num_zsq
    @__create_say_zsq('乘以')
    def cheng(self, n):
        self.__result *= n
    
    def show(self):
        self.__say('计算的结果是:%d' % self.__result)
        print('计算的结果是:%d' % self.__result)
    
    @property
    def result(self):
        return self.__result

c1 = Caculator(2)
c1.jia(6)
c1.jian(4)
c1.cheng(5)
c1.show()
print(c1.result)

链式编程

import win32com.client

class Caculator:
    def __check_num_zsq(func):
        def inner(self, n):
            if not isinstance(n, int):
                raise TypeError('当前这个数据的类型有问题,应该是一个整型数据')
            return func(self, n)
        return inner


    def __say(self, word):
        # 1 创建一个播放器对象
        speaker = win32com.client.Dispatch("SAPI.SpVoice")

        # 2 通过这个播报器对象,播报相对应的语音字符串
        speaker.Speak(word)

    def __create_say_zsq(word=''):
        def __say_zsq(func):
            def inner(self, n):
                self.__say(word + str(n))
                return func(self, n)
            return inner
        return __say_zsq
        


    @__check_num_zsq
    @__create_say_zsq()
    def __init__(self, num):
        self.__result = num
    
    @__check_num_zsq
    @__create_say_zsq('加')
    def jia(self, n):
        self.__result += n
        return self
    
    @__check_num_zsq
    @__create_say_zsq('减去')
    def jian(self, n):
        self.__result -= n
        return self

    @__check_num_zsq
    @__create_say_zsq('乘以')
    def cheng(self, n):
        self.__result *= n
        return self
    
    def show(self):
        self.__say('计算的结果是:%d' % self.__result)
        print('计算的结果是:%d' % self.__result)
        return self
    
    def clear(self):
        self.__result = 0
        return self
    
    @property
    def result(self):
        return self.__result

c1 = Caculator(2)
c1.jia(6).jian(4).cheng(5).show().clear().jia(555).jian(500).show()
print(c1.result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值