python3利用元类批量给所有继承类增加装饰器

python3利用元类批量给所有继承类增加装饰器

这是之前写的代码了,这次给传到csdn上面,大家有什么更好的建议可以回复我

不多说了,贴代码

# -*- coding: utf-8 -*-
# author:CY
# datetime:2019/4/25 16:37
import six
import types
import inspect
from functools import wraps
from collections import OrderedDict

def xx(func):
    @wraps(func)
    def wrap(*args,**kwargs):
        print('*'*150)
        print('执行了decorator')
        res=func(*args,**kwargs)
        if res:
            return res
        print('执行完毕')
        print('*'*150)
    return wrap


class Meta(type):

    @classmethod
    def options(cls,bases,attrs):
        new_attrs=OrderedDict()
        #循环自己的所有属性
        for key,value in attrs.items():
        	#对各种类型的方法进行分别处理
            if hasattr(value,'__func__') or isinstance(value,types.FunctionType):
                if isinstance(value,staticmethod):
                    new_attrs[key]=staticmethod(cls.func(value.__func__))
                elif isinstance(value,classmethod):
                    new_attrs[key] = classmethod(cls.func(value.__func__))
                elif isinstance(value, property):
                            new_attrs[key] = property(fget=cls.func(value.fget), fset=cls.func(value.fset), fdel=cls.func(value.fdel),doc=value.__doc__)
                elif not key.startswith('__') :
                    new_attrs[key]=cls.func(value)
                continue
            new_attrs[key]=value
		#循环所有继承类
        for base in bases:
            for key,value in base.__dict__.items():
                if key not in new_attrs:
                    if hasattr(value, '__func__') or isinstance(value,types.FunctionType):
                        if isinstance(value, staticmethod):
                            new_attrs[key] = staticmethod(cls.func(value.__func__))
                        elif isinstance(value, classmethod):
                            new_attrs[key] = classmethod(xx(value.__func__))
                        elif isinstance(value, property):
                            new_attrs[key] = property(fget=cls.func(value.fget), fset=cls.func(value.fset), fdel=cls.func(value.fdel),doc=value.__doc__)
                        elif not key.startswith('__'):
                            new_attrs[key] = xx(value)
                        continue
                    new_attrs[key] = value

        return new_attrs

    def __new__(cls, name, bases, attrs):
    	"""
    	name:类名,
    	bases:类所继承的父类
    	attrs:类所有的属性
    	"""
        cls.func=attrs.get('meta_decoator')
        assert inspect.isfunction(cls.func),(
            '传入的meta装饰器不正确'
        )
        #在类生成的时候做一些手脚
        new_attrs = cls.options(bases, attrs)
        return super().__new__(cls,name,bases, new_attrs)
        
class obj(object):

    def __init__(self):
        print('obj.__init__')

    @classmethod
    def one(self):
        print('obj.one')

@six.add_metaclass(Meta)
class obj1(obj):
	#只要继承类中有meta_decoator属性,这个属性的方法就会自动装饰下面所有的方法
	#包括类属性,实例属性,property属性,静态属性
    meta_decoator=xx
    aa=1
    @classmethod
    def three(cls):
        print('obj1.three')

    @staticmethod
    def four():
        print('obj1.four')

    def two(self):
        print(self.pro)
        print('obj1.two')

    @property
    def pro(self):
        return 1

b=obj1()
b.one()
b.two()
b.three()
b.four()

a=obj1
a.four()
a.three()

Console输出:

obj.__init__
******************************************************************************************************************************************************
执行了decorator
obj.one
执行完毕
******************************************************************************************************************************************************
******************************************************************************************************************************************************
执行了decorator
1
obj1.two
执行完毕
******************************************************************************************************************************************************
******************************************************************************************************************************************************
执行了decorator
obj1.three
执行完毕
******************************************************************************************************************************************************
******************************************************************************************************************************************************
执行了decorator
obj1.four
执行完毕
******************************************************************************************************************************************************
******************************************************************************************************************************************************
执行了decorator
obj1.four
执行完毕
******************************************************************************************************************************************************
******************************************************************************************************************************************************
执行了decorator
obj1.three
执行完毕
******************************************************************************************************************************************************
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Python中的装饰器是一种语法糖,通过在函数或的定义之前加上特定的修饰符,来对函数或进行功能增强或修改。常见的装饰器有@classmethod、@staticmethod、@property等。装饰器可以作用于函数或的定义,并允许我们在不修改原始函数或的情况下,添加额外的功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python装饰器详解](https://blog.csdn.net/weixin_44992737/article/details/125868592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python装饰器元类](https://blog.csdn.net/lovefantasy2010/article/details/122141626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [python装饰器以及元类的概念和解释!!!!](https://blog.csdn.net/m0_38116154/article/details/105650614)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值