Python decorator 2: 类
来源:互联网 发布:淘宝经营类目的优势 编辑:程序博客网 时间:2024/06/05 17:59
class myDecorator(object): def __init__(self, fn): print "inside myDecorator.__init__()" self.fn = fn def __call__(self): self.fn() print "inside myDecorator.__call__()" @myDecoratordef aFunction(): print "inside aFunction()" print "Finished decorating aFunction()" aFunction() # 输出:# inside myDecorator.__init__()# Finished decorating aFunction()# inside aFunction()# inside myDecorator.__call__()
上面这个示例展示了,用类的方式声明一个decorator。我们可以看到这个类中有两个成员:
1)一个是__init__(),这个方法是在我们给某个函数decorator时被调用,所以,需要有一个fn的参数,也就是被decorator的函数。
2)一个是__call__(),这个方法是在我们调用被decorator函数时被调用的。
上面输出可以看到整个程序的执行顺序。
__init()__可以看成函数式decorator中外层函数
__call()__可以看成函数式decorator中的内层函数
上面的class可以看成以下函数形式
def myDecorator(fn): print ("inside myDecorator.__init__()") def newDecorator(): fn(); print ("inside myDecorator.__call__()") return newDecorator
思考:
class makeHtmlTagClass(object): def __init__(self, tag, css_class=""): self._tag = tag self._css_class = " class='{0}'".format(css_class) \ if css_class !="" else "" def __call__(self, fn): def wrapped(*args, **kwargs): return "<" + self._tag + self._css_class+">" \ + fn(*args, **kwargs) + "</" + self._tag + ">" return wrapped@makeHtmlTagClass(tag="b", css_class="bold_css")@makeHtmlTagClass(tag="i", css_class="italic_css")def hello(name): return "Hello, {}".format(name)print (hello("Hao Chen"))
结果
<b class='bold_css'><i class='italic_css'>Hello, Hao Chen</i></b>
0 0
- Python decorator 2: 类
- python udpserver decorator 修饰类
- python decorator
- python decorator
- python decorator
- python decorator
- Python - Decorator
- Python decorator
- python decorator
- python decorator
- Python Decorator
- Python Decorator
- python decorator
- Python Decorator
- python decorator
- Python - decorator
- Python Decorator
- Python - Decorator
- RelativeLayout的各种属性整理
- 系统设计面试题
- Android之system_server与zygote之作用
- zookeeperd无法启动的分析
- Flask url_for如何生成动态的endpoint
- Python decorator 2: 类
- 遇到Class path contains multiple SLF4J bindings.该如何解决?
- 棋盘覆盖
- JAVA动态代理 和 Spring AOP 4种通知的简单实现
- nodejs中的中间件--Multer
- 欢迎使用CSDN-markdown编辑器---临时测试
- Error:Android Packager: [应用名] java.io.FileNotFoundException: G:\xxx\应用名.unaligned.apk (拒绝访问。)
- 一些球形包围盒,AABB包围盒,OBB包围盒的文章
- sort函数