Python 装饰器和抽象类
- #装饰器:对类或者函数进行功能的扩展
- '''
- #第一步:基本函数
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #调用函数
- la()
- la()
- #第二步:扩展函数功能(不能修改原函数)
- #用于扩展基本函数的函数
- def kuozhan(func):
- #扩展功能1
- print('la前参拜祈求')
- #调用基本函数
- func()
- #扩展功能2
- print('la后还愿感谢')
- #基本函数
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
- la = kuozhan(la)
- print(la)
- #调用函数
- #la()
- #la()
- #第三步:使用语法糖(就是语法) @语法
- #用于扩展基本函数的函数
- def kuozhan(func):
- #扩展功能1
- print('la前参拜祈求')
- #调用基本函数
- func()
- #扩展功能2
- print('la后还愿感谢')
- #基本函数
- @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- print(la)
- #调用函数
- #la()
- #la()
- #第四步:基本装饰器的实现
- #用于扩展基本函数的函数
- def kuozhan(func):
- #内部函数(扩展之后的la函数)
- def newla():
- #扩展功能1
- print('la前参拜祈求')
- #调用基本函数
- func()
- #扩展功能2
- print('la后还愿感谢')
- #添加返回值
- return newla
- #基本函数
- @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #print(la)
- #调用函数
- la()
- la()
- #第五步:带有参数的装饰器和带有返回值的装饰器
- #用于扩展基本函数的函数
- def kuozhan(func):
- #内部函数(扩展之后的la函数)
- def newla(shui,na):
- #扩展功能1
- print('la前参拜祈求')
- #调用基本函数
- func(shui,na)
- #扩展功能2
- print('la后还愿感谢')
- #添加返回值
- return newla
- #基本函数
- @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
- def la(who,where):
- print(who,'在',where,'tuokuzi')
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #print(la)
- #调用函数
- la('yangjun','羊圈')
- la('yanfei','鸟巢')
- #带有返回值的函数
- #用于扩展基本函数的函数
- def kuozhan(func):
- #内部函数(扩展之后的la函数)
- def newla():
- #扩展功能1
- print('la前参拜祈求')
- #调用基本函数
- result = func()
- #扩展功能2
- print('la后还愿感谢')
- #为newla添加返回值
- return result
- #添加返回值(装饰器用于返回未来的la函数的return)
- return newla
- #基本函数
- @kuozhan #la = kuozhan(la)#扩展之后的函数要重新赋值给基本函数!(但是此步骤还实现不了)
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- return '热翔'
- #print(la)
- #调用函数
- result = la()
- print('函数的返回值为:',result)
- #第六步:带有收集参数的函数的装饰器
- def kuozhan(func):
- #定义内部函数
- def newla(*w,**n):
- #扩展功能1
- print('la前参拜祈求')
- #调用基本函数
- func(*w,**n)
- #扩展功能2
- print('la后还愿感谢')
- #返回未来的la函数
- return newla
- #基本函数
- @kuozhan
- def la(*who,**nums):
- print('参与la的人有',who)
- print('la了多少',nums)
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #调用函数
- la('xuyu','wangcheng','xiufeng','zhangbo',xy = '15斤',wc = '15吨',xf = '15克',zb = '15ml')
- #第七步:带有参数的装饰器
- #装饰器
- def outer(arg):
- #这是装饰器代码
- def kuozhan(func):
- #print(func)
- #未来的la函数
- def newla():
- # 扩展功能1
- print('la前参拜祈求')
- # 调用基本函数
- func()
- # 扩展功能2
- print('la后还愿感谢')
- #未来的chifan函数
- def newchifan():
- #扩展功能1
- print('饭前洗洗手')
- #调用基本函数
- func()
- #扩展功能2:
- print('饭后抖一抖')
- #根据装饰的函数不同 返回不同的结果
- if arg == 'la':
- #返回的未来的la函数
- return newla
- elif arg == 'chi':
- return newchifan
- #返回装饰器
- return kuozhan
- #基本函数1
- @outer('la')#@装饰器函数
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #基本函数2
- @outer('chi')
- def chifan():
- print('eat meat')
- #调用基本函数
- la()
- chifan()
- #第八步:使用类作为装饰器参数
- #装饰器使用的操作类
- class Wish:
- #祈求方法
- def before():
- print('la前参拜祈求')
- #还愿方法
- def after():
- print('la后还愿感谢')
- def outer(cls):
- #装饰器函数
- def kuozhan(func):
- def newla():
- #扩展1(类中存在扩展内容)
- cls.before()
- #调用基本函数
- func()
- #扩展2(类中存在扩展内容)
- cls.after()
- return newla
- return kuozhan
- #基本参数
- @outer(Wish)#装饰器
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #调用函数
- la()
- #第九步:使用类作为装饰器
- class Kuozhan:
- #接受装饰器函数(函数outer)
- def __init__(self,arg):
- #此处可以将参数存入对象
- self.arg = arg
- #制作一个内部函数(真正的装饰器 函数kuozhan)
- def __call__(self,func):
- #print(func)
- #将func函数存入对象
- self.func = func
- #返回内部函数
- return self.newla
- #定义内部函数
- def newla(self):
- #扩展功能1
- print('la前参拜')
- #调用基本函数
- self.func()
- #扩展功能2
- print('la后还愿')
- #基本函数
- @Kuozhan('la') #la = 对象(la)
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #调用函数
- la()
- #第十步:装饰器来装饰一个类
- #装饰器函数
- def kuozhan(cls):
- print(cls)
- #声明一个类(函数)
- def newHuman():
- #扩展类的功能1
- cls.cloth = '衣服'
- #扩展功能2
- cls.hat = '帽子'
- #调用类(实例化对象)
- obj = cls()
- #返回实例化的对象
- return obj
- return newHuman
- #类 (被装饰的类)
- @kuozhan #Human = kuozhan(Human)
- class Human:#当作一个函数处理 Human()的返回值不是对象
- #属性
- sex = 'man'
- age = 18
- #方法
- def liaomei(self):
- print('妹子,这块砖头是你掉的吗')
- def tian(self):
- print('kubi')
- #实例化对象
- result = Human()
- print(result)
- print(result.cloth)
- print(result.hat)
- '''
- #第十一步
- #装饰器1
- def kuozhan1(func):
- #定义装饰之后的函数
- def newla1():
- #扩展功能1
- print('1-----la前参拜')
- #调用基本函数
- func()
- #扩展功能2
- print('1-----la后还愿')
- return newla1
- #装饰器2
- def kuozhan2(func):
- #定义装饰之后的函数
- def newla2():
- #扩展功能1
- print('2-----la前tuokuzi')
- #调用基本函数
- func()
- #扩展功能2
- print('2-----la后capigu')
- return newla2
- #基本函数
- @kuozhan2
- @kuozhan1
- def la():
- print('脚踏黄河两岸,手拿机密文件,前面机枪扫射,后面炮火连天')
- #调用函数
- la()
- #方法的分类
- class Cat:
- #属性
- color = 'orange'
- age = 2
- sex = '公'
- #方法
- #非绑定类的方法/对象方法/实例方法
- def getFish(self):
- print(self)
- print('抓鱼方法')
- #绑定类的方法
- def say():
- print('喵喵~~~')
- #类方法
- @classmethod
- def run(cls):
- print(cls)
- print('猫跑不跑直线取决于耗子')
- #静态方法
- @staticmethod
- def jump():
- print('跳起来四脚朝地')
- #实例化对象
- mimi = Cat()
- #对象方法
- mimi.getFish()
- #绑定类的方法
- Cat.say()
- #类方法
- Cat.run()
- #抽象类
- #具有抽象方法的类就是抽象类
- #抽象方法
- #没有方法体的方法就是抽象方法
- import abc
- class Dog(metaclass = abc.ABCMeta):#指定类的元素 -> 制作类的方法
- #属性
- age = 10
- sex = '母'
- color = '黑色'
- #方法
- #对象抽象方法
- @abc.abstractmethod
- def swimming(self):
- pass
- #静态抽象方法
- @abc.abstractstaticmethod
- def eat():
- pass
- #类抽象方法
- @abc.abstractclassmethod
- def drink(cls):
- pass
- #绑定类的方法
- @abc.abstractmethod
- def run():
- pass
- #具体的有内容的方法
- def say(self):
- print('旺旺')
- #实例化对象 会报错
- #xiaohei = Dog()
- #抽象类的使用
- import abc
- #conghao (boss)
- class User(metaclass = abc.ABCMeta):
- #属性
- username = ''
- userid = 0
- #方法
- #添加用户(mengfei)
- @abc.abstractmethod
- def add(self,name,pwd):
- pass
- #删除用户(yujiao)
- @abc.abstractclassmethod
- def dele(cls,uid):
- pass
- #修改用户(shengyue)
- @abc.abstractstaticmethod
- def mod():
- pass
- #查找用户(conghao)
- def find(self):
- print('查找用户操作')
- #文件2(mengfei)
- class MFUser(User):
- #添加用户(mengfei)
- def add(self,name,pwd):
- print('添加用户操作')
- #文件3(yujiao)
- class YJUser(MFUser):
- #删除用户(yujiao)
- @classmethod
- def dele(cls,uid):
- print(uid)
- print('删除用户操作')
- #文件4(shengyue)
- class SYUser(YJUser):
- #修改用户(shengyue)
- @staticmethod
- def mod():
- print('修改用户操作')
- #SYUser是真实的类不是抽象类
- user = SYUser()
- #添加操作
- user.add('mengfei','mf')
- #删除操作
- SYUser.dele(250)
- #修改操作
- user.mod()
- #查找操作
- user.find()
- #多态的实现
- #1.设计抽象类 定义规则
- import abc
- class Animal(metaclass = abc.ABCMeta):
- #尿
- @abc.abstractmethod
- def niao(self):
- pass
- #拉
- @abc.abstractmethod
- def la(self):
- pass
- #叫
- @abc.abstractmethod
- def jiao(self):
- pass
- #定义小狗类
- class Dog(Animal):
- #尿
- def niao(self):
- print('抬起后腿尿')
- #拉
- def la(self):
- print('蹲着拉')
- #叫
- def jiao(self):
- print('汪汪叫')
- #定义小猫类
- class Cat(Animal):
- #尿
- def niao(self):
- print('蹲着尿')
- #拉
- def la(self):
- print('蹲着拉')
- #叫
- def jiao(self):
- print('喵喵叫')
- #定义小鸡类
- class Chick(Animal):
- #尿
- def niao(self):
- print('站着尿')
- #拉
- def la(self):
- print('站着拉')
- #叫
- def jiao(self):
- print('嗷嗷叫')
- #动物行为类
- class Action():
- #定义初始化方法
- def __init__(self,animal):
- #将动物存入对象成员
- self.animal = animal
- #尿
- def niao(self):
- self.animal.niao()
- #拉
- def la(self):
- self.animal.la()
- #叫
- def jiao(self):
- self.animal.jiao()
- #实例化小狗
- xiaohei = Dog()
- #实例化小猫
- miaomiao = Cat()
- #实例化小鸡
- huahua = Chick()
- #实例化行为类对象
- a = Action(xiaohei)
- #调用行为对象的方法
- a.niao()
- a.jiao()
- a.la()
- #改变行为类对象中的动物
- a.animal = miaomiao
- #调用行为对象的方法
- a.niao()
- a.jiao()
- a.la
- #改变行为类对象中的动物
- a.animal = huahua
- #调用行为对象的方法
- a.niao()
- a.jiao()
- a.la()
Python 装饰器和抽象类的更多相关文章
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
- Python装饰器由浅入深
装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...
- Python装饰器与面向切面编程
今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...
随机推荐
- 设置Vim编辑器里Tab的长度,行号
使用Vim编辑器写脚本时,经常会遇到多重循环语句,习惯上会用tab键来补齐.这时设置tab键占用的长度,可以调节界面的松紧度,使其达到令人满意的效果. 在针对个别用户和所有用户来设置时,与编辑SSH相 ...
- Tools - GitBook
GitBook图书绑定自定义的域名 https://jingyan.baidu.com/article/335530daf86c3b19cb41c3f3.html
- keepalived入门
简介 Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服 ...
- 【vlan-hybird】
根据项目要求搭建号拓扑图如下: 分别配置pc1-5的ip地址: 配置交换机sw1: 配置交换机sw2
- 监听浏览器返回,pushState,popstate 事件,window.history对象
在WebApp或浏览器中,会有点击返回.后退.上一页等按钮实现自己的关闭页面.调整到指定页面.确认离开页面或执行一些其它操作的需求.可以使用 popstate 事件进行监听返回.后退.上一页操作. 一 ...
- 更新Composer依赖报错处理Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe
更新Composer依赖报错处理 Fatal error: Declaration of Fxp\Composer\AssetPlugin\Repository\AbstractAssetsRe po ...
- 用状态机表示SFC中的并行分支
过去一直认为,状态机表示SFC会不会是任务复杂化,这次简单实验了一下,感觉还可以.请看下面的控制. 在SFC中,A和B是一对并行分支,汇合后转移到C分支中,怎么了用状态机表示呢?这里我们在状态机里分别 ...
- python内置常用高阶函数(列出了5个常用的)
原文使用的是python2,现修改为python3,全部都实际输出过,可以运行. 引用自:http://www.cnblogs.com/duyaya/p/8562898.html https://bl ...
- Rmarkdown:输出html设置
在Rstudio中可自行更改主题样式 --- title: "题目" author: "name" date: "`r format(Sys.time ...
- 教你如何更改xshell中的转发规则
使用不同的类型转发,与之对应的端口,所以如果想要使用不同类型的转发就要更改端口使其与之一一对应.本集xshell专栏文章将为大家讲解如何更改转发规则. 更改转发规则操作如下: 1.打开会话对话框. 2 ...