• 26装饰器3(在面向对象的过程中使用装饰器)


    在面向对象的过程中使用装饰器

    先碎碎念一下自己的一番不易操作,那个语音播放的东西我总是搞不起来,就很难受,然后发现pycharm倒是可以直接弄,强推一下这个Pycharm中安装并导入pywin32包遇到的问题及解决-CSDN博客

    1然后,代码就很容易的写入了:

    1. import win32com.client
    2. #1.创建一个播报器对象
    3. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    4. #2.通过这个播报器对象,直接,播放相对应的语音字符串就可以
    5. speaker.Speak('我的名字是yx')
    6. class Caculator:
    7. def __say(self,word):
    8. # 1.创建一个播报器对象
    9. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    10. # 2.通过这个播报器对象,直接,播放相对应的语音字符串就可以
    11. speaker.Speak(word)
    12. def __checknumber_zsq(func):
    13. def inner(self,n):
    14. if not isinstance(n,int):
    15. raise TypeError('当前这个数据的类型有问题,应该是一个征信数据')
    16. return func(self,n)
    17. return inner
    18. @__checknumber_zsq
    19. def __init__(self,num):
    20. self.__say(num)
    21. self.__result = num
    22. @__checknumber_zsq
    23. def jia(self,n):
    24. self.__say(n)
    25. self.__result += n
    26. @__checknumber_zsq
    27. def jian(self,n):
    28. self.__say(n)
    29. self.__result -=n
    30. @__checknumber_zsq
    31. def cheng(self,n):
    32. self.__say(n)
    33. self.__result *=n
    34. @__checknumber_zsq
    35. def chu(self,n):
    36. self.__say(n)
    37. self.__result /=n
    38. def show(self):
    39. print('计算的结果是:%d'% self.__result)
    40. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    41. speaker.Speak('计算的结果是:%d'% self.__result)
    42. c1 = Caculator(2)
    43. c1.jia(6)
    44. c1.show()

    这里checknumber就成了一个装饰器,至于为什么是装饰器,传入的参数怎么样,就是之前那个很烦很复杂的一个分析流程过程。

    然后,应该有一种感觉就是,不仅仅是就是函数的写入,应该把他封装成为一个装饰器。

    2真的要实际上手做一下,不然很多错误都会容易犯

    碎碎念一下 女孩子真的好容易焦虑,好容易好容易啊,好容易犯错呀。

    (1)错误点

    1.比如说为什么会报错name '_Caculator__checknumber' is not defined?应该把装饰器写在类里面

    2.object() takes no parameters应该将定义def jia的这个函数与装饰器同样的缩进

    3.'NoneType' object is not callable就是千万千万不要忘了去写返回值return inner

    1. import win32com.client
    2. class Caculator:
    3. def __say_zsq0(func):
    4. def inner(self,n):
    5. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    6. speaker.Speak(n)
    7. return func(self,n)
    8. return inner
    9. def __say_zsq1(func):
    10. def inner(self,n):
    11. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    12. speaker.Speak('加%d'% n)
    13. return func(self,n)
    14. return inner
    15. def __say_zsq2(func):
    16. def inner(self,n):
    17. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    18. speaker.Speak('减%d'% n)
    19. return func(self,n)
    20. return inner
    21. def __say_zsq3(func):
    22. def inner(self, n):
    23. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    24. speaker.Speak('乘%d' % n)
    25. return func(self, n)
    26. return inner
    27. def __say_zsq4(func):
    28. def inner(self, n):
    29. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    30. speaker.Speak('除%d' % n)
    31. return func(self, n)
    32. return inner
    33. def __checknumber(func):
    34. def inner(self,n):
    35. if not isinstance(n,int):
    36. raise TypeError('输入的不是整型,请重新输入')
    37. return func(self,n)
    38. return inner
    39. @__checknumber
    40. @__say_zsq0
    41. def __init__(self,num):
    42. self.__result = num
    43. @__checknumber
    44. @__say_zsq1
    45. def jia(self,n):
    46. self.__result +=n
    47. @__checknumber
    48. @__say_zsq2
    49. def jian(self,n):
    50. self.__result -=n
    51. @__checknumber
    52. @__say_zsq3
    53. def cheng(self,n):
    54. self.__result *= n
    55. @__checknumber
    56. @__say_zsq4
    57. def chu(self,n):
    58. self.__result /= n
    59. def show(self):
    60. print('最后算的的结果是%d'%self.__result)
    61. c1 = Caculator(2)
    62. c1.jia(3)
    63. c1.jian(1)
    64. c1.cheng(5)
    65. c1.show()

    但是这个代码还是很冗余,现在要解决代码冗余的问题

    于是自己创造了一个创造装饰器的函数

    1. import win32com.client
    2. class Caculator:
    3. def creat_say_zsq(word=''):
    4. def __say_zsq(func):
    5. def inner(self,n):
    6. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    7. speaker.Speak(word + str(n))
    8. return func(self,n)
    9. return inner
    10. return __say_zsq
    11. def __checknumber(func):
    12. def inner(self,n):
    13. if not isinstance(n,int):
    14. raise TypeError('输入的不是整型,请重新输入')
    15. return func(self,n)
    16. return inner
    17. @__checknumber
    18. @creat_say_zsq()
    19. def __init__(self,num):
    20. self.__result = num
    21. @__checknumber
    22. @creat_say_zsq('加')
    23. def jia(self,n):
    24. self.__result +=n
    25. @__checknumber
    26. @creat_say_zsq('减')
    27. def jian(self,n):
    28. self.__result -=n
    29. @__checknumber
    30. @creat_say_zsq('乘')
    31. def cheng(self,n):
    32. self.__result *= n
    33. @__checknumber
    34. @creat_say_zsq('除')
    35. def chu(self,n):
    36. self.__result /= n
    37. def show(self):
    38. print('最后算的的结果是%d'%self.__result)
    39. c1 = Caculator(2)
    40. c1.jia(3)
    41. c1.jian(1)
    42. c1.cheng(5)
    43. c1.show()

    这是一个很有意思的地方在于,装饰器里面写了两个小闭包!!

    1. def creat_say_zsq(word=''):
    2. def __say_zsq(func):
    3. def inner(self,n):
    4. speaker = win32com.client.Dispatch('SAPI.SpVoice')
    5. speaker.Speak(word + str(n))
    6. return func(self,n)
    7. return inner
    8. return __say_zsq

  • 相关阅读:
    Kubernetes家族容器小管家Pod在线答疑?
    《Unity Magica Cloth从入门到详解》之(4)MeshCloth网布
    与缓存相关的状态码
    学习笔记 | 音视频 | 推流项目框架及细节
    第2章-矩阵及其运算-矩阵创建(1)
    1600*G. Special Permutation(构造&找规律)
    Python中的闭包是什么?
    互联网架构演进之路
    Adaptive AUTOSAR Technology Sharing
    数据库学习资源整理
  • 原文地址:https://blog.csdn.net/weixin_44528463/article/details/134039189