属性装饰器@property
class People:
@property
def currYear(self):
return self.birthYear + self.age - 1
def __init__(self, name, birthYear, age):
self.birthYear = birthYear
self.age = age
self.name = name
people = People('alan', 1991, 25)
# 输出:2015
print(people.currYear)
上面例子使用python 提供的@property 属性装饰器可以对currYear进行包装、其实相当于是一个函数、当你去获取currYear的时候、会执行定义好的函数,通过实例中的birthYear和age来判断生成当前属于哪一年。
当我们的业务场景存在某个属性和其他属性之间存在逻辑关系或者其他业务逻辑拓展关系的时候、可以使用属性装饰器来对字段进行功能拓展、实现数据的自动绑定。
函数装饰器
# -*- coding: UTF-8 -*-
def showSexZh(func):
def new_func(self):
sexZh = '男'
if(self.sex == 'f'):
sexZh = '女'
print(self.name + '\'s sex is ' + sexZh)
return new_func
def showSexExtends(func):
def new_func(self):
func()
heShe = 'he'
manWoman = 'man'
if(self.sex == 'f'):
heShe = 'she'
manWoman = 'woman'
print(heShe + ' is a good ' + manWoman)
return new_func
class People:
@property
def currYear(self):
return self.birthYear + self.age - 1
def showSex(self):
print(self.sex)
@showSexZh
def showSexZh(self):
pass
@showSexExtends
def showSexExtends(self):
print(self.sex)
def __init__(self, name, birthYear, age, sex):
self.birthYear = birthYear
self.age = age
self.name = name
self.sex = sex
people = People('alan', 1991, 25, 'f')
# 输出:f
print(people.showSex)
# 输出:alan's sex is 女
print(people.showSexZh)
# 输出:
# f
# she is a good woman
print(people.showSexExtends)
函数装饰器可以劫持函数、对函数进行逻辑修改、功能扩展等
@showSexZh装饰器可以对英文的性别转换为中文的(*要注意文件头部增加# -*- coding: UTF-8 -*-
以支持中文)
@showSexExtends在原本逻辑的基础上、扩展了逻辑,提供了扩展功能,进行额外的信息输出
根据实际不同的业务场景、可以进行不同的装饰器选择和逻辑实现。
装饰器的另外一个好处就是只需要对装饰函数的逻辑进行维护就可以修改项目中任何一个地方使用到被装饰的函数,或者去掉装饰器来恢复功能、删除扩展逻辑等,实现易维护、功能可插拔。