python中的装饰器和抽象类

装饰器和抽象类


装饰器就是对函数或者方法或者类进行修饰

'''
#第一步:创建一个普通函数
def laxi():print('噗哧噗哧噗哧噗哧~~~')#调用函数
laxi()
laxi()
''''''
#第二步:扩展函数的功能(不是装饰器)
#声明一个扩展函数
def decor(func):print('求神拜佛,祝愿一切顺利')func()#相当于调用laxi()print('拉稀成功,烧香还愿')
def laxi():print('噗哧噗哧噗哧噗哧~~~')
#将laxi函数传入decor函数中
laxi = decor(laxi)
#调用函数
laxi()
laxi()
''''''
#第三步:扩展函数的功能(不是装饰器),使用语法糖
#声明一个扩展函数
def decor(func):print('求神拜佛,祝愿一切顺利')func()#相当于调用laxi()print('拉稀成功,烧香还愿')
@decor #将laxi函数传入decor函数中#laxi = decor(laxi)
def laxi():print('噗哧噗哧噗哧噗哧~~~')
#调用函数
laxi()
laxi()
''''''
#第四步:实现基本的装饰器
def decor(func):#函数名随便写#声明内部函数来制作完整的装饰函数def _decor():#函数名随便写print('求神拜佛,祝愿一切顺利')func()#相当于调用laxi()print('拉稀成功,烧香还愿')return  _decor
@decor#laxi = decor(laxi)
def laxi():print('噗哧噗哧噗哧噗哧~~~')
#调用函数
laxi()
laxi()
laxi()
laxi()
''''''
#第五步:实现带有参数和返回值的哦装饰器
#装饰器
def decor(func):#这就是未来的拉稀函数def _decor():print('求神拜佛,祝愿一切顺利')#调用拉稀函数时接收拉稀函数本身的返回值result = func()#相当于调用laxi()print('拉稀成功,烧香还愿')#为装饰之后的函数返回一个值return result#返回内部函数作为未来的laxi函数return _decor
@decor
#拉稀函数
def laxi():print('噗哧噗哧噗哧噗哧~~~')return '热翔一碗'
#调用拉稀函数
jg = laxi()
print(jg)
''''''
#装饰器
def decor(func):#这就是未来的拉稀函数(原函数有什么形参,这里就要有什么形参)def _decor(who,weight):print('求神拜佛,祝愿一切顺利')#调用拉稀函数时接收拉稀函数本身的返回值result = func(who,weight)#相当于调用laxi()print('拉稀成功,烧香还愿')#为装饰之后的函数返回一个值return result#返回内部函数作为未来的laxi函数return _decor
@decor
#拉稀函数
def laxi(who,weight):print('噗哧噗哧噗哧噗哧~~~:'+who+'拉了'+weight+'斤便便')return '热翔一碗'
jg = laxi('马俊龙','10')
print(jg)
''''''
#第六步:收集参数装饰器(给装饰器内部的函数加参数)
def decor(func):#返回未来的拉稀函数def _decor(*who,*weight):print('求神拜佛,祝愿一切顺利')result = func(*who,**weight)print('拉稀成功,烧香还愿')return result#返回装饰之后的函数return _decor
@decor
def laxi(*who,**weight):print('噗哧噗哧噗哧噗哧~~~')print('参与拉屎的人有:',who)print('分别拉了多少:',weight)return  '热翔一大锅!'
#调用函数
jg = laxi('马俊龙','阎瑞龙','霍云瑞','曹睿','宋笑寒',mjl = '5斤',yrl = '2斤',hyr= '1吨',cr = '10克',sxh = '便秘')
print(jg)
''''''
#第七步:带有参数的装饰器(给装饰器加参数)
#定义装饰器(接收装饰器参数)
def decor(arg):#接收函数的参数def _decor(func):#未来的拉稀和吃饭函数的装饰def __decorla():#未来的拉稀函数print('求神拜佛,祝愿一切顺利')result = func()print('拉稀成功,烧香还愿')return resultdef __decorchi():#未来的吃饭函数print('我要开动了~')result = func()print('我吃完了~')return result#根据装饰器的参数返回不同的装饰结果if arg == 'la':return __decorlaelif arg == 'chi':return __decorchi#返回装饰器的第一层return _decor
@decor('la')
def laxi():print('噗哧噗哧噗哧噗哧~~~')return  '热翔一碗'
@decor('chi')
def chifan():print('吧唧吧唧吧唧吧唧!~~~')return '空碗一个'
#调用laxi
jg = laxi()
print(jg)
#调用chifan
jg = chifan()
print(jg)
''''''
#第八步:将类作为装饰器参数传入进来
#祝愿祈福类
class Wish:#绑定类的方法def before():print('烧香拜服,祝愿一切顺利!')#绑定类的方法def after():print('拉稀成功,烧香还愿~')
#装饰器
def decor(cls):def _decor(func):#这是未来的拉稀函数def __decor():cls.before()result = func()cls.after()return result#返回装饰之后的函数return __decorreturn _decor
@decor(Wish)
def laxi():print('噗哧噗哧噗哧噗哧~~~')return '热翔一手'
#调用函数
jg = laxi()
print(jg)
''''''
#第九步:将类作为装饰器使用
class Decor:def __init__(self,arg):#存入对象self.arg = arg#此魔术方法用于接收原函数def __call__(self,func):#将原方法存到对象当中self.func = func#返回装饰之后的函数return self.mylaxi#装饰函数def mylaxi(self):print('烧香拜服,祝愿一切顺利!')#调用原函数result = self.func()print('拉稀成功,烧香还愿~')return result
@Decor(5)
def laxi():print('噗哧噗哧噗哧噗哧~~~')return '热翔一手'
jg = laxi()
print(jg)
''''''
#第十步:为类添加装饰器(单例模式)
#声明一个容器用于存放对象
obj = {}#假设存入的对象键名only  值为对象本身 {'only':对象}
def decor(cls):#装饰器的操作def _decor():if 'only' in obj:#对象已经创建return obj['only']else:#对象没有创建,创建对象并返回obj['only'] = cls()return obj['only']#返回装饰的操作return _decor
#当前类只能实例化一个对象
@decor
class LiXue:name = '小雪'sex = '女'age = '21岁'def stuPy():print('好好学习天天向上!')
#实例化第一个对象
one = LiXue()
print(one)
two = LiXue()
print(two)
three = LiXue()
print(three)
'''
#第十一步:多个装饰器嵌套
#装饰器1
def decor1(func):def _decor1():print('脱裤子,准备放炮')result = func()print('拉屎完毕,提裤子走人~')return resultreturn _decor1
#装饰器2
def decor2(func):def _decor2():print('烧香拜佛,祝愿一切顺利!')result = func()print('操作成功,烧香还愿')return resultreturn _decor2
@decor2
@decor1
def laxi():print('扑哧扑哧扑哧扑哧扑哧~~')return '热翔一大杯'
jg = laxi()
print(jg)

方法的分类


类和对象的方法一共分为三种:

实例方法/对象方法

只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身!

绑定类的方法/静态方法

无需实例化,可以通过类直接调用的方法,方法中的参数既不接收对象名也不接受类。 一般方法可以独立调用,跟类中其他成员关联不大

类方法

无需实例化,可以通过类直接调用的方法
但是方法的第一个参数接收的一定是类本身,这种方法一般情况下需要借助类中其他成员操作
#包含各种方法的类
class Person:#绑定类的方法,静态方法@staticmethod #可以省略不写def walk():print('走路方法,绑定类的方法')#非绑定类的方法  对象方法def say(self):print(self)print('说话功能,非绑定类方法')#类方法@classmethod #必须写def drink(cls):print(cls)print('喝水方法,类方法')#调用非绑定类的方法(对象/实例方法)
tw = Person()
tw.say()#绑定类的方法,静态方法
Person.walk()#调用类方法
Person.drink()

抽象类


具有抽象方法的类就是抽象类。

抽象方法就是没有完成的方法。只有方法名称和参数,没有方法内容的方法。

作用:适合于领导指定开发规范及多人协作完成类。

abc abstract class 抽象类的缩写

抽象类的语法


#使用抽象类必须使用abc模块
import abc

#书写抽象类必须指定抽象类的元类 固定格式
class Human(metaclass = abc.ABCMeta):

<span class="hljs-comment">#&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7684;&#x5B9E;&#x4F8B;&#x65B9;&#x6CD5;/&#x975E;&#x7ED1;&#x5B9A;&#x7C7B;&#x7684;&#x65B9;&#x6CD5;</span>

@abc.abstractmethod
def smoking(self):
pass

<span class="hljs-comment">#&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7684;&#x7C7B;&#x65B9;&#x6CD5;</span>

@abc.abstractclassmethod
def say(cls):
pass

<span class="hljs-comment">#&#x5B9A;&#x4E49;&#x4E00;&#x4E2A;&#x62BD;&#x8C61;&#x7684;&#x9759;&#x6001;&#x65B9;&#x6CD5;/&#x7ED1;&#x5B9A;&#x7C7B;&#x7684;&#x65B9;&#x6CD5;</span>

@abc.abstractstaticmethod
def cry():
pass

抽象类的特征:


1.抽象类中可以包含具体的方法也可以包含抽象方法
2.抽象类中可以包含成员属性,而且属性没有抽象不抽象之分
3.抽象类无法实例化使用.
4.抽象类只能被其他类继承使用,(唯一的用法)
5.只有子类实现了抽象类的所有抽象方法之后,该子类才可以正常实例化使用。有一个抽象方法没有实现都不可以实例化
6.抽象类的作用是指定程序开发的标准(方法名,参数等)

多态


多态,多种状态!就是一个类,根据不同的情况,相同的方法产生不同的结果。

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

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

相关文章

eigen库安装_OpenCV+Eigen上位机程序移植(七十一)

1、给硬盘分区现在小伙伴们对于给电脑硬盘分区想必比较头疼&#xff0c;给电脑硬盘分区分为两种情况&#xff0c;一是在安装系统之前给系统硬盘分区&#xff0c;二是在安装系统之后给硬盘分区&#xff0c;我们现在购买的品牌机和笔记本的用户比较多&#xff0c;而且笔记本和品牌…

【实战操作】使用FFmpeg将一个视频文件中音频合成到另一个视频中 只需三秒

直接进入主题 主要参数&#xff1a; -i——设置输入文件名。-f——设置输出格式。-y——若输出文件已存在时则覆盖文件。-fs——超过指定的文件大小时则结束转换。-t——指定输出文件的持续时间&#xff0c;以秒为单位。-ss——从指定时间开始转换&#xff0c;以秒为单位。-t从…

苹果依旧强大 物联网领域举足轻重

近几天科技界最火爆的话题就是苹果和谷歌两家公司&#xff0c;一是苹果发布财报&#xff0c;二是谷歌人工智能围棋战胜欧洲冠军以及谷歌母公司Alphabet或将超越苹果&#xff0c;成为世界上市值最大的公司。而在我眼里&#xff0c;未来五年内依然属于苹果。回顾下苹果公司公布的…

linux之SQL语句简明教程---SUBSTRING

SQL 中的 substring 函数是用来抓出一个栏位资料中的当中一部分。这个函数的名称在不同的资料库中不全然一样&#xff1a; MySQL: SUBSTR( ), SUBSTRING( )Oracle: SUBSTR( )SQL Server: SUBSTRING( )最经常使用到的方式例如以下 (在这里我们用 SUBSTR( ) 为例)&#xff1a; SU…

H.264/AVC技术进展及其务实发展策略思考

随着NGN、3G及3G演进和NGBW等对视频、多媒体业务与网络应用的飞速发展需求&#xff0c;作为视频业务及存储应用核心技术的高效率 视频数字压缩编(译码)技术&#xff0c;愈来愈引起人们的关注&#xff0c;成为目前广播、视频与多媒体通信领域中的亮点与热点。制定视频编码标准的…

python中错误和异常处理

错误和异常处理 在python中一共有2种错误&#xff1a;一种是语法错误&#xff0c;另外一种是异常。 语法错误 语法错误也叫做解析错误&#xff0c;是指python无法正确的识别代码的造成的。根本原因在于人的行为&#xff1a;手残&#xff0c;脑残和眼残的行为。 解决方法&#x…

listview 每行后面的小箭头_主卧带小衣帽装修,这几个装修方案,你喜欢哪个?...

南京装修交流圈 - 知乎​www.zhihu.com现在大部分人购买的房子面积还是普遍偏小的&#xff0c;每行每业都有自己的服装讲究&#xff0c;不同的场地、见不同的人等等。家中能有一个衣帽间自然也就是心中所向往和追求的。能够有独立的一个房间来做衣帽间当然更好&#xff0c;今天…

【养成好习惯】使用pipreqs导出本项目使用的环境

pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本。就是当别人给你一个程序的时候&#xff0c;你要在自己电脑上运行起来&#xff0c;就需要安装程序所依赖的组件&#xff0c;总不能自己一个一个找吧。 # 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl…

开放医疗交通大数据技术 服务于公共便民领域

孙丕恕还建议&#xff0c;交通拥堵的数据也可以开放&#xff0c;孙丕恕介绍&#xff0c;目前已有导航软件有部分数据&#xff0c;但还有些滞后&#xff0c;如果能够做到实时更新数据&#xff0c;那么也可以为出行者避开拥堵&#xff0c;节约时间。此外&#xff0c;如果二手车的…

Nagios_在不同平台下的安装

Nagios 是一款开源的免费网络监视工具&#xff0c;致力于打造符合行业标准的 IT 基础架构的监控系统。Nagios 提供了服务器、网络和应用的完整的 IT 监控和报警&#xff0c;可以有效监控 Windows、Linux 和 Unix 的主机状态&#xff0c;以及交换机、路由器、打印机等网络设备。…

python中的模块和包

模块和包 一个模块就是一个包含python代码的文件。一个文件就是一个模块 为什么要使用模块 1.现在程序开发文件比较大&#xff0c;都放在一个文件中维护不方便&#xff0c;拆分成多个文件方便维护与管理 2.模块可以增加代码的重用率 3.模块可以当作命名空间如何定义自己的模块 …

2005年全球H.264编解码器荟萃

2005年全球H.264编解码器荟萃videosky.9126.com Peter Lee 2005-0920【摘要】H.264/AVC作为最新的视频编码标准&#xff0c;研究领域和产业界都非常看好该标准。尤其是产业界&#xff0c;针对H.264的软硬件编解码器可谓是百花齐放、百家争鸣。本文中&#xff0c;笔者对2005年全…

【Tensorflow】基于卷积神经网络实现车牌的识别

引言&#xff1a; 过去几周我一直在涉足深度学习领域&#xff0c;尤其是卷积神经网络模型。最近&#xff0c;谷歌围绕街景多位数字识别技术发布了一篇不错的paper。该文章描述了一个用于提取街景门牌号的单个端到端神经网络系统。然后&#xff0c;作者阐述了基于同样的网络结构…

脚本启动显示查询频繁被服务器防御_面对CC攻击,该如何进行防御

网站被攻击是一件十分让人恼火的事情&#xff0c;不仅仅是让网站速度变慢、访问异常&#xff0c;导致用户体验变差&#xff0c;用户大量流失&#xff0c;而且还会导致网站关键词排名下降甚至被降权&#xff0c;极大干扰了网站的正常稳定运行。那面对CC攻击&#xff0c;该如何进…

面对SDN/NFV部署挑战 网络厂商能做什么?

近年来&#xff0c;随着云计算的不断发展&#xff0c;网络虚拟化受到广泛关注&#xff0c;而作为网络虚拟化的实现方式&#xff0c;SDN自诞生之日起就担负着网络变革的使命。那么&#xff0c;SDN技术的驱动力是什么&#xff1f;SDN在引入现网的过程中&#xff0c;如何实现平滑无…

python中的tkinter模块

tkinter介绍 tkinter是python自带的GUI库&#xff0c;是对图形库TK的封装 tkinter是一个跨平台的GUI库&#xff0c;开发的程序可以在win&#xff0c;linux或者mac下运行 除此之外还存在很多图形库&#xff0c;例如 pythonWin 仅适合window的界面编程库 wxPython 第三方界面编…

PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。

题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊&#xff0c;所以最后输出的是sum0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么坑人啊啊啊啊 #include <iostream> #include <algorithm> #i…

【Django】文件上传以及celery的使用

上传文件、异步、初始化脚本 面试题&#xff1a; 项目中的静态文件处理&#xff08;JS/CSS/image&#xff09; 自己在机房内优化的方法&#xff1a;1. Nginx/lighttpd(lighty-douban)&#xff1a;Nginx 处理静态资源速度非常快&#xff0c;并且自身还带有缓存。2. 80: Nginx -&…

Android 查看每个应用的最大可用内存

http://blog.csdn.net/vshuang/article/details/39647167 Android 内存管理 &Memory Leak & OOM 分析 单个应用可用的最大内存 Android设备出厂以后&#xff0c;java虚拟机对单个应用的最大内存分配就确定下来了&#xff0c;超出这个值就会OOM。这个属性值是定义在…

分析一段H264视频数据

分析一段H264视频数据 Posted on 2007-05-31 09:42 vcommon 阅读(1968) 评论(8) 编辑 收藏 引用 分析 00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01 H264的数据流分为两种&#xff0c;一种是NAL UNIT stream(RTP),一种是 bits stream, 两者可以互相转换。我们分析的这个…