#装饰器:对类或者函数进行功能的扩展
'''
#第一步:基本函数
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 装饰器和抽象类的更多相关文章

  1. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  2. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  3. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  4. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  5. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  6. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  7. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

  8. Python装饰器由浅入深

    装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们 ...

  9. Python装饰器与面向切面编程

    今天来讨论一下装饰器.装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数 ...

随机推荐

  1. XAMPP中的MySQL与本地MySQL冲突的问题

    学习SQL时在本地中先安装了MySQL,后来因为项目需要又安装了XAMPP集成环境,今天在启动项目的时候发现启动MySQL各种问题(期望启动的是XAMPP中的MySQL服务),在Navicat中显示成 ...

  2. 关于Ext.js和Ext.Net的杂谈

    最近几年比较火的前端js框架extjs 算是其中的佼佼者.统一的UI设计,强悍的组件及丰富的插件,对浏览器良好的兼容性等优点使得许多公司使用Extjs,同时也使得无数程序猿开始研究这个玩意也包括我在内 ...

  3. I/O流、字符集

    1)InputStream.OutPutStream是输出输入的基础流,均为抽象类,提供了read和writer方法,所有的子类均实现read和writer方法,read在遇到输入源的结尾时返回-1. ...

  4. Python入门及容易!网摘分享给大家!

    Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...

  5. Android面试收集录 Android组件

    1.请说出Android SDK支持哪些方式显示富文本信息? 使用TextView组件可以显示富文本信息,如果要实现图文混排,需实现ImageGetter接口 使用WebView组件显示HTML页面 ...

  6. LeetCode:12. Integer to Roman(Medium)

    1. 原题链接 https://leetcode.com/problems/integer-to-roman/description/ 2. 题目要求 (1) 将整数转换成罗马数字: (2) 整数的范 ...

  7. XStream轻松转换xml和java对象

    首先引入所需的jar: xstream-1.4.9.xpp3_min-1.1.4c.dom4j-1.6.1, 或用maven管理jar包时在pom.xml中添加: <!-- https://mv ...

  8. 简单工具 & 杂技

    图片压缩: 腾讯智图(http://zhitu.isux.us/) 手机的所有尺寸大小规范: http://screensiz.es/phone 需求: 移动端宽高一致的盒子(因为移动端屏幕宽度不一样 ...

  9. pytest 测试报告

    测试报告 运行测试用例后,为了保存结果,我们需要生成测试报告,同时可以把运行的测试报告发送相关人员查阅,这时需要安装一个插件(pytest-html) pytest-html插件安装 pip inst ...

  10. Tomcat突然用开发工具启动不起来,只报了个红色的警告,没有其他任何异常

    碰到这个问题是,是因为我的catalina.bat文件做了配置修改,导致与工具这边的启动设置起了冲突 下面这个是我在Catalina.bat中新增的配置,删掉这个就可以了 set JAVA_OPTS= ...