魔法属性__call__方法
一个类里面__init__对象初始化对象,初始化对象完成之后如果想向对象里面传递参数就需要使用call方法
class Line(object):
def __init__(self, k, b):
self.k = k
self.b=b
def __call__(self,x):
print(self.k*x+self.b)
line=Line(1,2)
line(1)#实例化对象里面传递参数
缺点:为了计算多条线段的y值,需要保存多个k和b的值,浪费资源
闭包
与call方法非常类似,但是与类的call相比不会浪费资源
def line_1(k,b):
def create_y(x):
print(k*x+b)
return create_y
line_1_1=line_1(1,2)#默认值是None
line_1_1(1)
调用line_1这个函数之后,会遇到create_y函数,但是这是定义的一个函数没有传递过来参数,所以不会执行。这个时候跳过create_y的函数体,我们去执行return的是create_y的函数地址 ,所以line_1_1指向的是create_y的函数,这个时候我们line_1_1传递了这个参数。(感觉非常像是函数指针)
简单来说什么叫做闭包呢,其实就是一个函数里面嵌套着另一个函数的定义,我们反而需要的是另一个函数。而且一般来说内部函数会用到外部的函数的变量,我们就把内部函数和外部函数的变量叫做闭包.
和call方法相比的好处在于,用类创建出来的实例对象的空间会大很多,闭包创建出来的空间比较纯净
一般实现简单的功能的时候我们会使用闭包,写比较大的项目的时候我们还是使用面向对象的方法。函数和闭包的区别:函数就是一段代码他没有传递参数的功能,但是闭包即是一段代码也有传递参数的功能,传递很简单的数据和功能的时候我们就使用闭包
闭包修改数据(内部函数修改外部函数传递进来的变量)
x=300
def test_1():
x=200
def test_2():
print("----1----X=%d"%x)
x = 100
print("----2----X=%d"%x)
return test_2
t=test_1()
t()
实际运行出现错误,因为第一个打印应该打印的是外部函数的变量,但是内部函数有局部变量,所以他想打印内部函数的变量,但是内部函数的变量是写在打印下面的,所以这段代码就挂了
x=300
def test_1():
x=200
def test_2():
nonlocal x
print("----1----X=%d"%x)
x = 100
print("----2----X=%d"%x)
return test_2
t=test_1()
t()
在改变全局变量的时候我们使用golobal,在改变闭包外部函数的变量的时候,我们需要使用nonlocal。结果如下:
author: specyue@mail.ustc.edu.cn
github:https://github.com/zhangyuespec/mini_web