函数装饰器:

  @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()

  当函数带有多个参数的时候,需要用到魔法参数

    1.   *args是位置(可变)参数,表示任意个无名参数,是一个tuple。

    2.   **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

Posted on 2020-06-27 12:06  Schrodinger'sdoris  阅读(240)  评论(0编辑  收藏  举报