python decorator扩展

该博客探讨了Python中函数注册和修饰器的使用。通过`register_func`装饰器实现函数字典动态注册,允许在运行时根据随机数调用不同方法。同时,展示了类修饰器`Components`用于在类初始化时注入属性。此外,还介绍了一个计数器修饰器`counter`,用于记录类实例的数量。
摘要由CSDN通过智能技术生成

扩展1, 接收参数

# coding=utf-8


MOVE_FUNC_DICT = {}


# 相当于一个函数执行, 并返回一个decorator
# 只会初始化的时候执行一次
def register_func(move_type):
	def _inner(fun):
		MOVE_FUNC_DICT[move_type] = fun
		return fun
	return _inner


def decorator(func):
	def __inner(*args, **kwargs):
		print '修饰'
		func(*args, **kwargs)
	return __inner



class Test(object):

	def run(self):
		import random
		while True:
			MOVE_FUNC_DICT[random.randint(0, 2)](self)
			# self.move_a()

	@register_func(0)
	def move_a(self):
		print 'a'

	@register_func(1)
	def move_b(self):
		print 'b'

	@register_func(2)
	def move_c(self):
		print 'c'


if __name__ == '__main__':
	t = Test()
	t.run()


扩展2,修饰类

def Components(*args, **kwargs):
	def _inner(kclass):
		kclass.init_dict(*args, **kwargs)
		return kclass

	return _inner


@Components({1: '1'})
class A(object):
	test = None

	def __init__(self):
		pass

	@classmethod
	def init_dict(cls, _dict):
		cls.test = _dict

a = A()

print a.__class__.test



  1. 没有参数, 2就是在3基础上包了一层

def counter(cls):
    obj_list = []
    def wrapper(*args, **kwargs):
        new_obj = cls(*args, **kwargs)
        obj_list.append(new_obj)
        print "class:%s'object number is %d" % (cls.__name__, len(obj_list))
        return new_obj
    return wrapper

@counter
class my_cls(object):
    STATIC_MEM = 'This is a static member of my_cls'
    def __init__(self, *args, **kwargs):
        print self, args, kwargs
        print my_cls.STATIC_MEM

c = my_cls()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值