第二十四节 闭包

'''
__call__方法:对象后面加括号,触发执行

'''

class Foo():

    def __init__(self, k, b):
        self.k = k
        self.b = b

    def __call__(self, x):
        print(self.k * x + self.b)


ojb = Foo(1, 2)  # 执行__init__
ojb(3)  # 执行__call__方法

print(50*"@")
'''
闭包:函数嵌套,一般两层,内层函数会用到外层函数传递进来的数据,而外层函数会返回内层函数的引用,避免全局变量的使用,又可以根据外层函数的传递进来的数据做到类似对象生成实例的效果
'''

def text1(k, b):
    m = 100
    def return_y(x):
        nonlocal m  # 修改外部变量的值
        m =200
        print(k * x + b,m)
    return return_y

t1 = text1(1, 1)
t1(0)
t1(1)
t1(2)
print(50*"@")
t2 = text1(2, 2)
t2(0)
t2(1)
t2(2)


'''
函数、匿名函数、闭包、对象 当做实参时有什么区别?
1、匿名函数能够完成基本的简单功能....传递时这个函数的引用 只有功能
2、普通函数能够完成较为复杂的功能...传递时这个函数的引用 只有功能
3、闭包能够完成较为复杂的功能...传递是这个闭包中的函数及数据,因此传递时功能+数据
4、对象能够完成最为复杂的功能...传递是很多数据+很多功能,因此传递是功能+数据
'''

 

posted @ 2020-03-31 00:50  kog_maw  阅读(93)  评论(0编辑  收藏  举报