1. @prototype 修饰符的用法
- class Person(object) :
- def __init__(self) : self.__x = None def setx(self, value) : self.__x = value def getx(self) :
- return self.__x def delx(self) : del self.__x x = property(getx, setx, delx)
- p = Person()
- p.x = 123 # 自动调用 setx 方法print p.x # 自动调用 getx 方法
- del p.x # 自动调用 delx 方法
另外一种用法:
- class Person(object) :
- def __init__(self) : self.__x = None @prototype def x(self) :
- return self.__x @x.setter def x(self, value) : self.__x = value @x.deleter def x(self) : del self.__x p = Person()
- p.x = 123 # 自动调用 setx 方法print p.x # 自动调用 getx 方法
- del p.x # 自动调用 delx 方法
2. staticmethod 修饰符
被 staticmethod 修饰符的表示这是一个类的静态方法,可以被类直接调用
- class Person(object) : @staticmethod def hello() : print 'hello world!!!'
- if __name__ == '__main__': Pserson.hello()
3. 装饰器。
实例:
- def now() print '2016-05-11'
- now()
如果我想在 now 执行前执行另外一个方法,而不修改 now 方法呢?那么就用到了装饰器
- def log(func) : #func参数传递的值就是now方法def wrap( * args, **kw) :
- # * args,
- **kw方法接收任何形式的参数
- print '2016-05-10'
- return func( * args, **kw)#执行now方法
- return wrap
- @log def now() : print '2016-05-11'
- now()#相当于执行now = log(now),可以看到func就是now的值,用装饰方法覆盖now
问题来了,我想传递参数呢?
- def log(text) : def decorator(func) : def wrap( * args, **kw) : print text
- return func( * args, **kw) return wrap
- return decorator
- @log('2016-05-10') def now() : print '2016-05-11'
- now()#相当于执行now = log('2016-05-10')(now)
那么装饰器就完了么?如果是当前的功能,那么就可以了,但是有的地方如果使用了函数签名(属性),就要出问题了。
- print now.__name__
- #result: wrap
函数名字怎么变成 wrap 了呢?如果某些代码用到使用函数签名(属性)就要出问题了。
python 的 functools 模块提供了修改函数属性的方法 wraps
- from functools import wraps
- def log(text) : def decorator(func) : @wraps(func) def wrap( * args, **kw) : print text
- return func( * args, **kw) return wrap
- return decorator
- @log('2016-05-10') def now() : print '2016-05-11'
- now()
- print now.__name__#now
来源: http://www.92to.com/bangong/2017/07-15/25261590.html