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

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

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

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

import win32com.client
#1.创建一个播报器对象
speaker = win32com.client.Dispatch('SAPI.SpVoice')
#2.通过这个播报器对象,直接,播放相对应的语音字符串就可以
speaker.Speak('我的名字是yx')
class Caculator:def __say(self,word):# 1.创建一个播报器对象speaker = win32com.client.Dispatch('SAPI.SpVoice')# 2.通过这个播报器对象,直接,播放相对应的语音字符串就可以speaker.Speak(word)def __checknumber_zsq(func):def inner(self,n):if not isinstance(n,int):raise TypeError('当前这个数据的类型有问题,应该是一个征信数据')return func(self,n)return inner@__checknumber_zsqdef __init__(self,num):self.__say(num)self.__result = num@__checknumber_zsqdef jia(self,n):self.__say(n)self.__result += n@__checknumber_zsqdef jian(self,n):self.__say(n)self.__result -=n@__checknumber_zsqdef cheng(self,n):self.__say(n)self.__result *=n@__checknumber_zsqdef chu(self,n):self.__say(n)self.__result /=ndef show(self):print('计算的结果是:%d'% self.__result)speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak('计算的结果是:%d'% self.__result)
c1 = Caculator(2)
c1.jia(6)
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

import win32com.client
class Caculator:def __say_zsq0(func):def inner(self,n):speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak(n)return func(self,n)return innerdef __say_zsq1(func):def inner(self,n):speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak('加%d'% n)return func(self,n)return innerdef __say_zsq2(func):def inner(self,n):speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak('减%d'% n)return func(self,n)return innerdef __say_zsq3(func):def inner(self, n):speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak('乘%d' % n)return func(self, n)return innerdef __say_zsq4(func):def inner(self, n):speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak('除%d' % n)return func(self, n)return innerdef __checknumber(func):def inner(self,n):if not isinstance(n,int):raise TypeError('输入的不是整型,请重新输入')return func(self,n)return inner@__checknumber@__say_zsq0def __init__(self,num):self.__result = num@__checknumber@__say_zsq1def jia(self,n):self.__result +=n@__checknumber@__say_zsq2def jian(self,n):self.__result -=n@__checknumber@__say_zsq3def cheng(self,n):self.__result *= n@__checknumber@__say_zsq4def chu(self,n):self.__result /= ndef show(self):print('最后算的的结果是%d'%self.__result)
c1 = Caculator(2)
c1.jia(3)
c1.jian(1)
c1.cheng(5)
c1.show()

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

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

import win32com.client
class Caculator:def creat_say_zsq(word=''):def __say_zsq(func):def inner(self,n):speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak(word + str(n))return func(self,n)return innerreturn __say_zsqdef __checknumber(func):def inner(self,n):if not isinstance(n,int):raise TypeError('输入的不是整型,请重新输入')return func(self,n)return inner@__checknumber@creat_say_zsq()def __init__(self,num):self.__result = num@__checknumber@creat_say_zsq('加')def jia(self,n):self.__result +=n@__checknumber@creat_say_zsq('减')def jian(self,n):self.__result -=n@__checknumber@creat_say_zsq('乘')def cheng(self,n):self.__result *= n@__checknumber@creat_say_zsq('除')def chu(self,n):self.__result /= ndef show(self):print('最后算的的结果是%d'%self.__result)
c1 = Caculator(2)
c1.jia(3)
c1.jian(1)
c1.cheng(5)
c1.show()

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

    def creat_say_zsq(word=''):def __say_zsq(func):def inner(self,n):speaker = win32com.client.Dispatch('SAPI.SpVoice')speaker.Speak(word + str(n))return func(self,n)return innerreturn __say_zsq

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Java的音乐网站管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding) 代码参考数据库参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

vue3中使用svg并封装成组件

打包svg地图 安装插件 yarn add vite-plugin-svg-icons -D # or npm i vite-plugin-svg-icons -D # or pnpm install vite-plugin-svg-icons -D使用插件 vite.config.ts import { VantResolver } from unplugin-vue-components/resolvers import { createSvgIconsPlugin } from…

操作系统【OS】I/O核心子系统

定义 举例 用户层软件 用户层软件实现了与用户交互的接口用户层软件将用户请求翻译成格式化的I/O请求,并通过“系统调用”请求操作系统内核的服务用户可直接使用该层提供的、与I/0操作相关的库函数对设备进行操作 如发送read命令如讲二进制整数转换为ascii码的…

Spring Boot Endpoints:端点

Spring Boot 内置端点以及暴露端点列表: 端点被启用后,并不一定能够被访问,还要看端点是否被暴露,并且暴露的方式是怎样的。因为端点可能会包含敏感信息,所以需要谨慎暴露相关端点。Spring Boot 3.0.0 更改了默认暴露…

Vue3基本使用

1.vue3特性 vue的引入方式 cdn引入 示例代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title> </head> <body><h2>哈哈哈</h2><p>我是内容&…

基于opencv的selenium滑动验证码的实现

这篇文章主要介绍了基于opencv的selenium滑动验证码的实现&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起学习学习吧 基于selenium进行动作链 由于最近很多人聊到滑动验证码…

C语言之文件操作

目录 实现文件读写 打开文件fopen函数的用法 写文件fprintf函数的用法 读文件fscanf函数的用法 写文件fwrite函数的用法 读文件fread函数的用法 关闭文件fclose函数的用法 实现文件读写 一直以来&#xff0c;我们学习C语言都是数据的处理&#xff0c;这些数据都是在内存…

解决javascript报错:SyntaxError: Invalid Unicode escape sequence

在处理cookie时报这个错&#xff1a; 网上搜了一圈都说是反斜杠问题&#xff0c;要把\替换成/ 但是试了网上的replace替换&#xff1a; replace(/\\/g, /) 结果没有用&#xff01;&#xff01;&#xff01; 然后我干脆直接做了一个最简单字符串赋值&#xff0c;再打印出来。…

0036【Edabit ★☆☆☆☆☆】【让我加油】Let‘s Fuel Up!

0036【Edabit ★☆☆☆☆☆】【让我加油 】Let’s Fuel Up! control_flow language_fundamentals numbers Instructions A vehicle needs 10 times the amount of fuel than the distance it travels. However, it must always carry a minimum of 100 fuel before setting o…

C++ stack 的使用

目录 1. 无参构造函数 2. void push(const T& x) 3. void pop() 4. T& top() 5. bool empty() 6. size_t size() 7. 总结 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与…

快递排序Java

快速排序是在工具类常用的排序算法&#xff0c;快速排序的思想主要是选定一个基准元素&#xff0c;然后找到基准元素的位置&#xff0c;然后再分别排序他左边的和他右边的,快速排序是不稳定的&#xff0c;时间复杂度位Nlog(N),最极端的情况就是一个反向排好顺序的数组&#xff…

leetcode55. 跳跃游戏

leetcode55. 跳跃游戏 方案一&#xff1a;dfs超时 class Solution { public:bool dfs(vector<int>& nums, int idx){if (idx (nums.size() - 1))return true;int dist nums.size() - idx;for (int i 0; (i < nums[idx]) && (i < dist); i) {if (d…

【机器学习合集】人脸表情分类任务Pytorch实现TensorBoardX的使用 ->(个人学习记录笔记)

人脸表情分类任务 注意&#xff1a;整个项目来自阿里云天池&#xff0c;下面是开发人员的联系方式&#xff0c;本人仅作为学习记录&#xff01;&#xff01;&#xff01;该文章原因&#xff0c;学习该项目&#xff0c;完善注释内容&#xff0c;针对新版本的Pytorch进行部分代码…

快速入门Elasticsearch:安装、基本概念、分词器和文档基本操作详解

本文主要介绍快速入门 Elasticsearch&#xff0c;从 安装 、 基本概念 、 分词器 、*** 文档基本操作 *** 这 4 个方面快速入门。 Elasticsearch 是一款近实时的搜索引擎&#xff0c;底层是基于 Lucene 做搜索&#xff0c;再此基础上加入了分布式的特性&#xff0c;以便支持海…

2022年12月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 关于Python语言的注释,以下选项中描述错误的是?( ) A: Python语言有两种注释方式:单行注释和多行注释 B: Python语言的单行注释以#开头 C: Python多行注释使用###来做为标记 D: …

RabbitMQ高级篇 笔记

这是一些高级的内容。 RabbitMQ还是运行在网络上的&#xff0c;倘若遇到了网络故障&#xff0c;mq自己挂了&#xff0c;出异常了&#xff0c;都会造成最终状态不一致的问题。这就是可靠性问题。 可靠性&#xff1a;一个消息发送出去之后&#xff0c;至少被消费1次。 要解决这3个…

十九、类型信息(1)

本章概要 为什么需要 RTTI RTTI&#xff08;RunTime Type Information&#xff0c;运行时类型信息&#xff09;能够在程序运行时发现和使用类型信息 RTTI 把我们从只能在编译期进行面向类型操作的禁锢中解脱了出来&#xff0c;并且让我们可以使用某些非常强大的程序。对 RTTI …

第十三章:L2JMobius学习 – 玩家攻击怪物

本章节&#xff0c;我们学习一下玩家周边怪物的刷新。在上一章节中&#xff0c;我们提过这个事情。当玩家移动完毕之后&#xff0c;会显示周围的游戏对象&#xff0c;其中就包括NPC怪物。当然&#xff0c;玩家“孵化”自己&#xff08;调用spawnMe方法&#xff09;的时候&#…

Hadoop分布式安装

首先准备好三台服务器或者虚拟机&#xff0c;我本机安装了三个虚拟机&#xff0c;安装虚拟机的步骤参考我之前的一篇 virtualBox虚拟机安装多个主机访问虚拟机虚拟机访问外网配置-CSDN博客 jdk安装 参考文档&#xff1a;Linux 环境下安装JDK1.8并配置环境变量_linux安装jdk1.8并…

Zoho Mail荣登福布斯2023年企业邮箱榜单,引领行业新方向!

几十年来&#xff0c;电子邮件一直是电子通信的重要形式&#xff0c;并且在未来的许多年里&#xff0c;它可能会无处不在。尽管有大量免费电子邮件服务可供用户和企业使用&#xff0c;但其中许多服务缺乏专门的功能&#xff0c;例如适合办公室使用的集中管理。 福布斯小型企业顾…