在继承的基础上增加新功能,重载,重写区别

装饰器:

函数a说,我是装饰器啊,其他哪个函数顶着我,我就吃了谁,然后吐出来我的和你的返回结果
testng的UI自动化,@beforetest,@beformethod,这种都是testng框架的装饰器。包括类方法和静态方法:@classmethod,@staticmethod
装饰器模式可以动态的把新的职责添加到对象上,在扩展性方面比通过继承实现扩展更富有弹性。这里关键点是“动态”,也就是运行时;而继承在编译的时候已经确定
装 饰模式可以给我们很好的帮助,通过装饰模式重新封装一个类而不是通过继承来完成,简单点说,三个继承关系ClassA,ClassB,ClassC 三个类,我要在ClassB 类上增强一些功能怎么办?我想你会坚决的顶回去!不允许,对了,为什么呢?你增强的功能是修改ClassB 类中的方法吗?增加方法吗 ?对ClassC的影响呢?特别是ClassC 有多个的情况,你怎么办?这个评估的工作量就是够你受的,所以这个是不允许的,那还是要解决问题的呀,怎么办?
通过建立ClassBDecorator 类来修饰ClassB,
等于说是创建了一个新的类,这个对原有程序没有变更,通过扩充很好的完成了这次变更
重载 overloadin--多态 1) 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。
2) Java的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型给它们的不同参数个数和参数类型来决定具体使用哪个方法这就是多态性。
3) 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
1.重写必须继承,重载不用。
2.重写的方法名,参数数目相同,参数类型兼容, 重载的方法名相同,参数列表不同
重写与装饰器:
重写利用继承的方法,父亲不能完全满足条件,覆盖父类特性,写入自己新的特性
装饰器除了有自己方法还有父类方法,不覆盖
多态与装饰器:
1、多态是可以强制转换的,而且指向父类的话,只能用父类的方法,不能使用子类独有的。
2、而装饰模式主要通过构造方法传入子类对象,IO体系就是使用装饰模式,装饰增强父类的方法
 
 
>>> def x(f):
       def z():
...     print  f()+1
       return z
...
>>> @x
... def y():
...     print 2
...
y  ===  x(y)  ====  z
y()  ===  x(y)()  ====  z()  ===  f()+1

装饰器学习九步法—第一步

第一步:最简单的函数,准备附加额外功能

代码示例:

# -*- coding:utf -8 -*-'''示例1: 最简单的函数,表示调用了两次'''

def myfunc():

print "myfunc() called."

myfunc()

myfunc()

第二步:使用装饰函数在函数执行前和执行后分别附加额外功能

代码示例:

# -*- coding:utf -8 -*-'''示例2: 替换函数(装饰)

装饰函数的参数是被装饰的函数对象,返回原函数对象

装饰的实质语句: myfunc = deco(myfunc)'''

def deco(func):

print "before myfunc() called."

func()

print " after myfunc() called."

return func

def myfunc():

print " myfunc() called."

myfunc = deco(myfunc)

myfunc()

myfunc()

装饰器学习九步法—第三步

# -*- coding:utf -8 -*-'''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)”

但发现新函数只在第一次被调用,且原函数多调用了一次。等价于第二步

程序'''

def deco(func):

print "before myfunc() called."

func()

print " after myfunc() called."

return func

@deco

def myfunc():

print " myfunc() called."

myfunc()

myfunc()

#注释掉最后两行代码可以看到装饰器函数也被执行

装饰器学习九步法—第四步

第四步:使用内嵌包装函数来确保每次新函数都被调用

代码示例:

# -*- coding:gbk -*-'''示例4: 使用内嵌包装函数来确保每次新函数都被调用,

内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装

函数对象'''

def deco(func):

def _deco():

print "before myfunc() called."

func()

print " after myfunc() called."

# 不需要返回func,实际上应返回原函数的返回值

return _deco

@deco

def myfunc():

print " myfunc() called."

return 'ok'

myfunc()

myfunc()

列表传入

#encoding=utf-8

import time

def deco(func):

def __deco():

list=[]

func(list)

print list

return __deco

@deco

def myfunc(list):

list.append(1)

print " myfunc() called."

@deco

def yourfunc(list):

list.append(2)

print " yourfunc() called."

myfunc()

print "*"*50

yourfunc()

装饰器学习九步法—第五步

第五步:对带参数的函数进行装饰

代码示例:

# -*- coding:utf -8 -*-'''示例5: 对带参数的函数进行装饰,

内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装

函数对象'''

def deco(func):

def _deco(a, b):

print "before myfunc() called."

ret = func(a, b)

print " after myfunc() called. result: %s" % ret

return ret

return _deco

@deco

def myfunc(a, b):

print " myfunc(%s,%s) called." % (a, b)

return a + b

myfunc(1, 2)

myfunc(3, 4)

#encoding=utf-8

import time

def deco(func):

def __deco(a,b):

res=func(a,b)

print res

return __deco

@deco

def myfunc(a,b):

print " myfunc(%s,%s) called."%(a,b)

return a+b

myfunc(1,3)

装饰器学习九步法—第六步

第六步:对参数数量不确定的函数进行装饰

代码示例:

# -*- coding:utf -8 -*-'''示例6: 对参数数量不确定的函数进行装饰,

参数用(*args, **kwargs),自动适应变参和命名参数'''

#encoding=utf-8

import time

def deco(func):

def __deco(*arg,**kw):

print "before myfunc() called"

res=func(*arg,**kw)

print "after myfunc() called"

print res

return __deco

@deco

def myfunc(a,b,c,d):

print " myfunc(%s,%s) called."%(a,b)

return a+b

myfunc(1,3,5,5)

#encoding=utf-8

import time

def deco(func):

def __deco(*arg,**kw):

print "before myfunc() called"

res=func(*arg,**kw)

print "after myfunc() called"

print res

return __deco

@deco

def myfunc(a,*arg,**kw):

result=a

#print " myfunc(%s,%s) called."%(a,b)

for i in arg:

result+=i

for k in kw:

result+=kw[k]

return result

myfunc(1,3,5,x=5)

装饰器学习九步法—第七步

# -*- coding:utf -8 -*-'''示例7: 在示例4的基础上,让装饰器带参数,

和上一示例相比在外层多了一层包装。

装饰函数名实际上应更有意义些'''

#encoding=utf-8

import time

def deco(arg):

def _deco(func):

def __deco():

print "before myfunc() called"

res=func()

print "after myfunc() called"

print res

return __deco

return _deco

@deco("mymodule")

def myfunc():

print " myfunc() called."

@deco("module2")

def myfunc2():

print "myfunc2() called"

myfunc()

myfunc2()

装饰器学习九步法—第八步

第八步:让装饰器带 类 参数

代码示例:

# -*- coding:utf-8 -*-'''示例8: 装饰器带类参数'''

class locker:

def __init__(self):

print "locker.__init__() should be not

called."

@staticmethod

def acquire():

print u"locker.acquire() called.(这是静

态方法)"

@staticmethod

def release():

print u" locker.release() called.(不需要

对象实例)"

def deco(cls):

'''cls 必须实现acquire和release静态方法'''

def _deco(func):

def __deco():

print"before %s called [%s]." %

(func.__name__, cls)

cls.acquire()

try:

return func()

finally:

cls.release()

return __deco

return _deco

@deco(locker)

def myfunc():

print " myfunc() called."

myfunc()

myfunc()

装饰器学习九步法—第九步

第九步:装饰器带类参数,并分拆公共类

到其他py文件中,同时演示了对一个函数

应用多个装饰器

代码示例:

# -*- coding:utf -8 -*-'''mylocker.py: 公共类 for 示例9.py'''

class mylocker:

def __init__(self):

print("mylocker.__init__() called.")

@staticmethod

def acquire():

print("mylocker.acquire() called.")

@staticmethod

def unlock():

print(" mylocker.unlock() called.")

class lockerex(mylocker):

@staticmethod

def acquire():

print("lockerex.acquire() called.")

@staticmethod

def unlock():

print(" lockerex.unlock() called.")

def lockhelper(cls):

'''cls 必须实现acquire和unlock静态方法'''

def _deco(func):

def __deco(*args, **kwargs):

print("before %s called." %

func.__name__)

cls.acquire()

try:

return func(*args, **kwargs)

finally:

cls.unlock()

return __deco

return _deco

python之设计模式的装饰器9步学习的更多相关文章

  1. Python入门之装饰器九步学习入门

    第一步:最简单的函数,准备附加额外功能 '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print("myfunc() called.") myfu ...

  2. python设计模式之装饰器详解(三)

    python的装饰器使用是python语言一个非常重要的部分,装饰器是程序设计模式中装饰模式的具体化,python提供了特殊的语法糖可以非常方便的实现装饰模式. 系列文章 python设计模式之单例模 ...

  3. python 设计模式之装饰器模式 Decorator Pattern

    #写在前面 已经有一个礼拜多没写博客了,因为沉醉在了<妙味>这部小说里,里面讲的是一个厨师苏秒的故事.现实中大部分人不会有她的天分.我喜欢她的性格:总是想着去解决问题,好像从来没有怨天尤人 ...

  4. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  5. guxh的python笔记三:装饰器

    1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...

  6. C#中的 Attribute 与 Python/TypeScript 中的装饰器是同个东西吗

    前言 最近成功把「前端带师」带入C#的坑(实际是前端带师开始从cocos转unity游戏开发了) 某天,「前端带师」看到这段代码后问了个问题:[这个是装饰器]? [HttpGet] public Re ...

  7. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  8. python 3.x 的装饰器笔记

    今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...

  9. 设计模式:装饰器(Decorator)模式

    设计模式:装饰器(Decorator)模式 一.前言    装饰器模式也是一种非常重要的模式,在Java以及程序设计中占据着重要的地位.比如Java的数据流处理,我们可能看到数据流经过不同的类的包装和 ...

随机推荐

  1. python 9*9乘法口诀 猜数字游戏

  2. 095、如何创建Swarm集群?(Swarm02)

    参考https://www.cnblogs.com/CloudMan6/p/7862254.html   本节我们将创建三节点的swarm集群(操作系统Ubuntu 16.04 ,Docker 版本均 ...

  3. jQuery全选功能

    $(document).ready(function(){ //为父按钮添加事件 $("#chk_all").click(function(){ var a=$("#ch ...

  4. 81. Search in Rotated Sorted Array II (JAVA)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e. ...

  5. Redis集群部署一直卡在Waiting for the cluster to join ......(Redis集群总线配置)

    redis集群总线端口为redis客户端端口加上10000,比如说你的redis 6379端口为客户端通讯端口,那么16379端口为集群总线端口 我搭建的redis集群中端口号是从 7001 ~ 70 ...

  6. 286-基于6U VPX 的mSATA高性能数据存储板

    基于6U VPX 的mSATA高性能数据存储板 一.板卡概述 该产品系我司自主研发.基于标准6U VPX架构. 二.产品特性       最大存储容量8TB        读写方式RAID0 ,读写速 ...

  7. tp5 apache 转 nginx 需要配置的伪静态

    location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=$ last; break; } }

  8. Codeforces1204C. Anna, Svyatoslav and Maps (贪心 + Floyd)

    题目链接:传送门 题目大意: 给出n<=100的有向图,和路径p,求p的最短子序列v,使得依次经过v中所有点的路径为p. 思路: 题意其实就是让我们求路径上的一些关键点v,对于所有的关键点:vi ...

  9. 第02课:启动GDB调试

    使用GDB调试程序一般有三种方式: gdb filename gdb attach pid dgb filename corename 也对应这本节课的核心内容: 直接调试目标程序 附加进程 调试co ...

  10. Ubuntu下Cmake编译C++程序Helloworld

    1.首选新建工程目录 mkdir helloworld 2.新建文件目录 cd helloworld mkdir bin mkdir lib mkdir src mkdir include mkdir ...