函数装饰器:
@log_in
用于扩展原来函数功能的一种函数
返回函数的函数
在不更改原函数的代码前提下给函数增加新的功能
def log(func):
def wapper():
print("start")
func()
print("end")
return wapper
@log
def hello():
print("hello")
if __name__ == "__main__":
hello() 一个函数可以使用多个装饰器,按调用的顺序来
带参数的函数装饰器:
在原来的装饰器上再加一层用来返回参数
def log(name = None):
"""
:type name: object
"""
def decorator(func):
def wapper():
print("start{0}".format(name))
func()
print("end{0}".format(name))
return wapper
return decorator
@log("xiaom")
def hello():
print("hello")
if __name__ == "__main__":
hello()
当函数带有多个参数的时候,需要用到魔法参数
-
*args
是位置(可变)参数,表示任意个无名参数,是一个tuple。 -
**kwargs
是关键字(可变)参数,是一个键值对的dict。
-
def log(name = None):
"""
:type name: object
"""
def decorator(func):
def wapper(*args,**kwargs):
print("start{0}".format(name))
print(args)
print(kwargs)
rest = func(*args,**kwargs)
print("end{0}".format(name))
print("————————————————————")
return rest
return wapper
return decorator
@log("xiaom")
def hello():
print("hello")
@log("from add")
def add(a,b):
return a+b
if __name__ == "__main__":
hello()
rest = add(5,6)
print(rest)
函数装饰器之@wraps:
对以前写好的函数内置属性,如__doc__,__name__ 等,使用装饰器后会发生改变,给它还原回来
用法:
def decorator(func):
@wraps(func)
def wapper(*args,**kwargs):
类的装饰器:
原理和函数迭代器差不多
def f(self):
print("{0}>要吃东西".format(self.name))
def eat(cls):
cls.eat = f
return cls
@eat
class Cat(object):
def __init__(self,name):
self.name = name
if __name__ == "__main__":
cat = Cat("小黑")
cat.eat()
迭代器:
迭代以为着重复都次,就像循环那样
实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象是迭代器
调用方法__next__()或(next())时,迭代器返回其下一个值
如果迭代器没有可供返回的值,触发stoplteration异常
例:使用iter()将列表转换为一个迭代器对象
停止:raise StopIteration
Repetition is the mother of all learning重复是学习之母。等到长大,学知识,技巧、爱情、事业、交流....倘若懂得行动的力量,不怕重复,不怕犯错误,那就大有希望靠近幸福了。