python装饰器实现属性修改、函数劫持、功能扩展

属性装饰器@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在原本逻辑的基础上、扩展了逻辑,提供了扩展功能,进行额外的信息输出

根据实际不同的业务场景、可以进行不同的装饰器选择和逻辑实现。
装饰器的另外一个好处就是只需要对装饰函数的逻辑进行维护就可以修改项目中任何一个地方使用到被装饰的函数,或者去掉装饰器来恢复功能、删除扩展逻辑等,实现易维护、功能可插拔。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值