写一个带形参的装饰器
装饰器的本身就是一个参数为函数或者类的函数或者类
1 | |
可以看到在忽略参数的时候 def debug(fun)就是一个单纯的函数,得益于python的语法糖,装饰器可以用一种很方便的@debug方式来呈现出来,但是本质上就是print_a=debug(print_a)
使用类作为装饰器,使用类作为装饰器的时候,上述的语法依旧继承,所以相当于debug(print_a)是在做初始化,后面则是调用,由此可见为了能调用,我们需要复写__call__方法
1 | |
可以看到,用类来定义装饰器涉及到实例的传递过程,容易出错
修饰类的装饰器
1 | |
可以看到修饰类的装饰器更为简单,这是因为类是不带参数的
python自带装饰器的理解
python有三种常见的装饰器@property @staticmethod @classmethod
@property来源于封装的思想,对于一个类,如果所有的对象都是能直接访问的
1 | |
用装饰器实现单例模式
首先是python里面的单例模式,要实现单例,就要在类中建立好对象并且保存在私有变量中,每当新建实例的时候就返回已经新建的类
1 | |
上面的方法是用__new__()来实现单例的代码,使用的时候只需要继承该类
下面贴用装饰器实现单例的例子
1 | |