说实在的,我一直担心有人问,你会python不?
我会!
那你给我讲讲装饰器的用法吧?
啊??我从来没用过装饰器啊
这样面试就尴尬了。。。。。
python的装饰器呢,就是一种对原先的函数或类进行修饰的函数,一定要注意,他的返回值是是一个参数,在返回时它会发生调用,往往传入的参数也是一个函数(不一定)。装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能,如果一段代码很重要,老板说:小王啊,这代码是咱公司的核心代码,你可千万别改坏了,那这时候装饰器就派上用场了
先写一个简单的装饰器,
如果我们要对发生的函数进行计时(也就是在函数外面用装饰器修饰),看下面这个很小的例子
import time def deco(func): #要修饰的对象,可以是函数可以是类 #f1(*args,**kwargs) def f1(a,b): # 这里要修饰下面的calc函数,所以传入俩个参数 ,如果事先不确定要传入什么参数 可以用*args ,**kwargs替代 start = time.time() func(a,b) # 同上 如果事先不确定要传入什么参数 可以用*args ,**kwargs替代 time.sleep(0.5) print("time is %f" %(time.time() -start)) return f1 # 返回值一定要是函数 @deco def calc(a,b): print("the result is %d"%(a+b)) if __name__ =='__main__': f = calc f(3,4)
现在我们要对构造的类对象,进行修饰,让他只能创造出一个单例对象,这是剑指offer上的第二题,我还第一次知道装饰器原来对类也可以修饰呢。看下面这个例子:
def singleton(llx,*args,**kwargs): # 这里的llx 其实就是cls,为了看上去更具一般性,我设置成这个 #顺便提一句 cls 通常我们用@classmethod 定义类方法,用self定义实例化方法,用staticmethod 定义静态方法,这要弄清楚 instancedict ={} def f1(): if llx not in instancedict: instancedict[llx] =llx(*args,*kwargs) return instancedict[llx] return f1 @singleton# 修饰类方法 class MyClass(object): a = 1 def __init__(self,x): self.x = 10 one = MyClass3() two = MyClass3() two.a = 3 print(one.a) # 3 print(id(one)) # 1863322033064 print(id(two)) # 1863322033064 print(one == two) # True print(one is two) # True
这篇文章 参考了https://blog.youkuaiyun.com/xiangxianghehe/article/details/77170585
和剑指offer https://github.com/Jack-Lee-Hiter/AlgorithmsByPython/blob/master/Target%20Offer/Singleton.py