0
点赞
收藏
分享

微信扫一扫

python基础-----装饰器------类中所有函数使用装饰器的正确姿势

文章目录



1.常规做法


def decorator(func):
    def __logdec(self, *args, **kwargs):
        print('【Start--------%s】' % func.__name__)
        print("\n")
        func(self, *args, **kwargs)
        print("\n")
        print('【End--------%s】' % func.__name__)
        print("\n")
        print("\n")

    return __logdec


class AlienClass(object):
    @decorator
    def print_info(self, info):
        print("--------->{}".format(info))

    @decorator
    def print_name(self, name):
        print("===============>>{}".format(name))
        
	@decorator
	def xxxxxxxx():
		# 此处省略N个函数............
		pass

alien = AlienClass()
alien.print_info("hello world !")

alien.print_name("alien")

# 最终效果如下:

【Start--------print_info】

--------->hello world !

【End--------print_info】



【Start--------print_name】

===============>>alien

【End--------print_name】




2.优雅的姿势


import inspect, types

def decorator(func):
    def __logdec(self, *args, **kwargs):
        print('【Start--------%s】' % func.__name__)
        print("\n")
        func(self, *args, **kwargs)
        print("\n")
        print('【End--------%s】' % func.__name__)
        print("\n")
        print("\n")

    return __logdec


class AlienClass(object):

    def print_info(self, info):
        print("--------->{}".format(info))

    def print_name(self, name):
        print("===============>>{}".format(name))


for name, fn in inspect.getmembers(AlienClass):
    if isinstance(fn, types.FunctionType):
        setattr(AlienClass, name, decorator(fn))


alien = AlienClass()
alien.print_info("hello world !")
alien.print_name("alien")



3.python2注意点


# 如下地方需要替换

for name, fn in inspect.getmembers(AlienClass):
    if isinstance(fn, types.UnboundMethodType):
        setattr(AlienClass, name, decorator(fn))


举报

相关推荐

0 条评论