闭包
在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么我们将这个函数以及用到的一些变量,里面的整体为闭包
def test(a,b):
def test_in(x):
print(a*x+b)
return test_in
line1 = test(1,1)
line1(2)
装饰器
装饰器的作用:增强函数的功能,确切的说,可以装饰函数,也可以装饰类
1.内置装饰器@property
作用:由于python进行属性的定义时,没办法设置私有属性,因此要通过@property的方法来进行设置。
这样可以隐藏属性名,让用户进行使用的时候无法随意修改
注意点:加了@property后,可以用调用属性的形式来调用方法,后面不需要加()
# @property只读属性
class DataSet(object):
def __init__(self):
self._images = 1
self._labels = 2 #定义属性的名称
@property
def images(self):
return self._images
@property
def labels(self):
return self._labels
l = DataSet()
print(l.images) # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。
# @age.setter属性修改,并限制属性
class Person(object):
def __init__(self, name, age):
self.name = name
self.__age = 18
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if age < 18:
print('年龄必须大于18岁')
return
self.__age = age
return self.__age
xm = Person('xiaoming', 20)
print(xm.age)
print('----------')
xm.age = 10
print(xm.age)
print('----------')
xm.age = 20
print(xm.age)
2.内置装饰器@staticmethod和@classmethod
@classmethod类方法:可以在class内实例化class,作用就是比如输入的数据需要清洗一遍再实例化,可以把清洗函数定义在class内部并加上@classmethod
@staticmethod静态方法:就是一普通函数,只不过封装在class内部,使用class.func()访问,很少使用
class Data_test2(object):
day=0
month=0
year=0
def __init__(self,year=0,month=0,day=0):
self.day=day
self.month=month
self.year=year
@classmethod
def get_date(cls, string_date):
#这里第一个参数是cls, 表示调用当前的类名
year,month,day=map(int,string_date.split('-'))
date1=cls(year,month,day)
#返回的是一个初始化后的类
return date1
def out_date(self):
print("year:{0}".format(self.year))
print("month:{0}".format(self.month))
print("day:{0}".format(self.day))
r=Data_test2.get_date("2016-8-6")
r.out_date()
重构类的时候不必要修改构造函数,只需要额外添加你要处理的函数,然后使用装饰符 @classmethod 就可以
3.日志打印
def logger(fuc):
def wrapper(*args, **kargs):
print("开始记录{0}的日志".format(fuc.__name__))
fuc(*args, **kargs)
print("打印结束")
return wrapper
@logger
def add(x, y):
print("x:{0} + y:{1} = z:{2}".format(x, y, x + y))
add(200, 50)
4.时间计时
import time
def timer(fuc):
def wrapper(*args, **krags):
t1 = time.time()
fuc(*args, **krags)
t2 = time.time()
print("消耗时间:{0}".format(t2 - t1))
return wrapper
@timer
def time_sleep(time_sleep):
time.sleep(time_sleep)
time_sleep(5)
5.带参数的函数装饰器
def say_hello(country):
def wrapper(fuc):
def deco(*args, **krags)
if country == "china":
print("你好!")
elif country == "america":
print("hello.")
else:
return ''
fuc(*args, **krags)
return deco
return wrapper
@say_hello("china")
def chinese():
print("我是中国人")
chinese()
6.不带参数的类装饰器
基于类装饰器的实现,必须实现__call__ 和 init__两个内置函数。__init :接收被装饰函数,call :实现装饰逻辑。
class logger(object):
def __init__(self, func):
self.func = func
def __call__(self, *args, **kwargs):
print("[INFO]: the function {func}()is running..."\
.format(func=self.func.__name__))
return self.func(*args, **kwargs)
@logger
def say(something):
print("say {}!".format(something))
say("hello")
7.带参数的类装饰器
class logger(object):
def __init__(self, level='INFO'):
self.level = level
def __call__(self, fuc):
def wapper(*args, **kwargs):
print("[{0}]: the function {1}()is running...".format(self.level, fuc.__name__))
fuc(*args, **kwargs)
return wapper
@logger('WRANING')
def say(something):
print("say {0}!".format(something))
say("hello")
版权声明:如无特殊说明,文章均为本站原创,转载请注明出处
本文链接:http://zhangyanc.club/article/python_base2/
许可协议:署名-非商业性使用 4.0 国际许可协议