1.闭包:属于高阶函数,在函数内部再定义一个函数,且内部函数用到了外部的变量。
def fun_a(number_a):
def fun_b(number_b):
print('内嵌函数的参数是:%s,外部函数的参数:%s'%(number_b,number_a))
return number_a+number_b
return fun_b
result = fun_a(10) #result是一个函数
print(result(15))

闭包需要三个条件,缺一不可:
①必须有一个内嵌函数;
②内嵌函数里必须引用一个定义在外部函数里的变量,即内部函数引用外部变量;
③外部函数必须返回内部函数。
2.装饰器
装饰器本质上是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
装饰器常用场景:插入日志、性能测试、事务处理、缓存、权限校验等。
from functools import wraps
import time
def logger(func):
@wraps(func)
def write_logging(*args):
print('[info]--时间是:%s'%time.strftime('%H:%M:%S',time.localtime()))
func(*args)
return write_logging
@logger #装饰器
def work(name):
print('%s在工作'%name)
work('张三')

3.也可以用类的方法创建装饰器
from functools import wraps
import time
class Logs(object):
def __init__(self,log_file = 'out.log',level = 'INFO'):
self.log_file = log_file
self.level = level
def __call__(self, func): #定义装饰器,需要有接受函数
@wraps(func)
def write_logging(*args):
log = '[%s]--时间是:%s' %(self.level,time.strftime('%H:%M:%S', time.localtime()))
print(log)
func(*args)
return write_logging
@Logs(log_file='work1.log',level='WARNING') #装饰器
def work(name):
print('%s在工作'%name)
work('张三')

4.动态修改类
import types
class Person(object):
def __init__(self,x_name,x_age):
self.name = x_name
self.age = x_age
#类定义好之后,动态的给对象赋予一个新对象属性
p = Person('张三',23)
p.sex = '男' #添加新属性
#给对象添加函数
def fun1(self,work):
print('%s正在完成的工作:%s'%(self.name,work))
p.fun1 = types.MethodType(fun1,p) #给P对象添加函数
p.fun1('摸鱼')
#给Person类动态添加一个类函数
@classmethod
def class_fun1(cls,work):
print('类函数的work是:%s'%work)
Person.work = class_fun1
p.work('学Python')
#给Person类添加静态函数
@staticmethod
def static_fun1(work):
print('静态函数中的work是:%s'%work)
Person.staticFun = static_fun1
p.staticFun('前端')

也可以使用slots来限制属性:
class Student(object):
#只允许当前类拥有name和sex属性
__slots__ = ('name','sex')
pass
s = Student()
s.name = '张三'
s.sex = '男'
s.age = 23
print(s)
432

被折叠的 条评论
为什么被折叠?



