闭包:
1.闭包的概念:当一个函数返回一个函数,且内部函数可以使用外部函数变量的行为,就叫闭包。如下所示:
def foo():
m=3;
n=4;
def bar():
a=5;
return m+n+a;
return bar;
闭包可以被理解为一个只读的对象,你可以给他传递一个属性,但它只能提供给你一个执行的接口。因此在程序中我们经常需要这样的一个函数对象——闭包,来帮我们完成一个通用的功能,比如后面会提到的——装饰器。使用闭包
第一种场景 ,在python中很重要也很常见的一个使用场景就是装饰器,Python为装饰器提供了一个很友好的“语法糖”——@,让我们可以很方便的使用装饰器,装饰的原理不做过多阐述,简言之你在一个函数func上加上@decorator_func, 就相当于decorator_func(func):
def decorator_func(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper
@decorator_func
def func(name):
print 'my name is', name
# 等价于
decorator_func(func)
在装饰器的这个例子中,闭包(wrapper)持有了外部的func这个参数,并且能够接受外部传过来的参数,接受过来的参数在原封不动的传给func,并返回执行结果。def ret_func(a):
def func():
return a
return func
func1 = ret_func(2)
func1()
闭包有什么用:
惰性求值 || 延迟求值 || 在一系列函数调用中保持某个状态
闭包会捕捉内部函数的环境,因为可用于包装现有函数。
类(python中是多继承)
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于C#
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
基类:
#!/usr/bin/python
#FileName:BaseModel.py =>模块名
class BaseClass:
def __init(self,name,age):
self.name=name
self.age=age
print "baseclass is inited "
def speak(self,name):
print "base class is speak:%s" %name
if __name__=="__main__":
b=BaseClass()
子类:
#!/usr/bin/python
#FileName:SubClass.py =>模块名
import BaseModel
class SubClass(BaseModel.BaseClass):
def __init__(self,name,age,salary):
BaseModel.BaseClass.__init__(self,name,age)
self.salary=salary
print "SubClass is inited and the salary is :%s"%self.salary
def talk(self,sth):
print "%s talking %s"%(self.name,sth)
BaseModel.BaseClass.speak(self.sth)
if __name__=="__main__":
s=SubClass("Joan",1,800)
s.talk("a story")
若子类中不写初始化函数会调用父类中的初始化函数。
接口:
接口只是定义了一些方法,没有去实现,在python中接口由抽象类和抽象方法实现,接口是不能实例化的,只能由别的类继承去实现相应的功能。
特点:
1.子类必须要有父类的方法2.子类实现的方法必须跟父类的方法的名字一样
装饰器
装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限验证等场景,装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
装饰器的实现原理:
#无参数装饰器原理:def login(funct):print('passed user veriftcation...')return funct#函数返回形参的值或内存地址def tv():print('welcom to TV page') tvv= login(tv)#执行login函数,参数tv返回tv函数的内存地址 tvv()#执行生成器函数将执行tv函数传参装饰器原理
#实例:实现程序执行前的验证def login(funct):#验证函数def inner(arg):#嵌套函数是为了不让验证函数不执行print('passed user veriftcation...') funct(arg)return inner#将内嵌函数内存地址返回给login @login#@是装饰器的语法糖,它实际就是等于tv=login(tv)def tv(name):#执行程序函数print('welcom %s to TV page' %name)#tv = login(tv) #相当与@login,与装饰器的作用一样 tv('zhang')#执行程序前,通过装饰器验证#上面程序执行原理说明: #程序执行后,首先扫描程序内的装饰器(@login)执行后,跳转到装饰器函数 #将函数读取到内存,login将返回inner函数的内存地址,执行tv时,首先执行inner函数,tv参数‘zhang’传递给inner,打印输出,funct参数值为tv,执行funct后就会执行tv函数。理解装饰器原理就是把tv函数包起来执行,先验证后执行。