python闭包,接口,类继承的浅析

2022-10-08 08:06:42

闭包:

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参数

3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
基类:
#!/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函数包起来执行,先验证后执行。
  • 作者:凉城以北夜微凉
  • 原文链接:https://blog.csdn.net/hello_mujinhua/article/details/78957863
    更新时间:2022-10-08 08:06:42