# -*- coding:utf-8 -*-
'''f.__name__
f.__doc__
f.__module__ 所属模块
f.__defaults__ 默认参数
f.__closure__ 闭包'''
import functools
def f(a, b = 1, c = []):
'''func for print abc'''
print a, b, c
return
def f_():
a = 2
b = 10
c = 100
return lambda k: a ** k + b
def mydecorator(func):
@functools.wraps(func) # 新添加的一行
def wrapper(*args, **kargs):
'''wrapper function'''
print 'IN wrapper'
func(*args, **kargs)
return wrapper
@mydecorator
def example():
'''example function'''
print 'IN example'
# 如果现在调用 print example.__name__ print example.__doc__将会返回wrapper的信息
# 使用标准库 functools 中的装饰器 wraps 装饰内部包裹函数
if __name__ == '__main__':
print f.__name__
print f.__doc__
print f.__module__
print f.__defaults__
print f.__closure__
f.__defaults__[1].append('abc')
f(100)
print f.__defaults__ #所以在默认参数里面不要使用可变对象
p = f
print p.__name__
print '*' * 30
print f_.__closure__
g = f_()
print g.__closure__
c = g.__closure__[2]
# 现在运行程序会产生‘IndexError: tuple index out of range’错误
# 只有匿名函数中使用到的 a, b 在闭包里
print c.cell_contents
print '*' * 30
print g(10) # 原来 ** 运算符是次数
9-2为被装饰的函数保存元数据
最新推荐文章于 2023-06-20 22:11:03 发布