Python 正则表达式匹配类方法的动态装饰器

Python 正则表达式匹配类方法的动态装饰器,python,python-3.x,overriding,python-decorators,class-decorator,Python,Python 3.x,Overriding,Python Decorators,Class Decorator,我想在委托类实现之类的情况下简化方法修饰 假设第三方“服务”类有十分之一的方法 您希望覆盖大量方法,以便能够装饰它们 创建委托子类并重写选定的方法 这种情况会导致如下情况: 类服务委托(服务): @装饰师 def维修方法1(自身): super().service_method1() @装饰师 def维修方法2(自身): super().service_method2() @装饰师 def维修方法3(自身): super().service_method3() ... 这个解决方案似乎不是

我想在委托类实现之类的情况下简化方法修饰

  • 假设第三方“服务”类有十分之一的方法
  • 您希望覆盖大量方法,以便能够装饰它们
  • 创建委托子类并重写选定的方法
这种情况会导致如下情况:

类服务委托(服务):
@装饰师
def维修方法1(自身):
super().service_method1()
@装饰师
def维修方法2(自身):
super().service_method2()
@装饰师
def维修方法3(自身):
super().service_method3()
...
这个解决方案似乎不是很有成效。因此,可以实施类似的措施:

def-methods\u-decorator(deco,regex:str,base\u-class=None):
def f(c:类型):
非局部基类
#默认基类是修饰类本身
如果不是基类:
基本类=c
避免函数:List[str]=[“\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#正则表达式函数
def lmd(i):返回i[0]不在avoid_函数和re.fullmatch中(regex,i[0])
funcs=list(过滤器(lmd,基本类.\uuuuu dict\uuuuu.items())
对于func中的func:
打印(str(类型(func[1]))
如果类型(func[1])==函数类型:
setattr(c,func[0],deco(func[1]))
elif类型(func[1])==StaticMethodType:
setattr(c,func[0],staticmethod(deco(func[1]))
elif类型(func[1])==ClassMethodType:
setattr(c,func[0],classmethod(deco(func[1]))
返回c
返回f
@方法装饰器(deco=decorator1,regex=“service\u method.*”,base\u class=service)
@方法装饰器(deco=decorator2,regex=“other\u method.*”,base\u class=Service)
@方法\u decorator(deco=decorator3,regex=“new.*)
类ServiceDelegate(服务):
def新方法(自我):
#这里有一些新功能
...
其思想是从基类“复制”和修饰正则表达式选择的函数,而不必重写它们。这个实现在我的特定场景中适用

我对python非常陌生,所以我不确定这是一种好方法还是一种不好的做法

  • 是否有任何理由不应用此类解决方案
  • 现有的python包是否提供类似的功能

解决方案是减少键入。然而,它只是将复杂性从添加方法修饰符转移到命名方法和添加魔法类修饰符

更改方法装饰器的名称和方法的名称是一个更好的主意

class ServiceDelegate(Service):
    @service
    def method1(self):
        super().method1()

    @service
    def method2(self):
        super().method2()

    @service
    def method3(self):
        super().method3()

省略
服务
前缀并添加
@service
完全不会改变键入字符的数量,并且不再需要magic class decorator。

解决方案是减少键入。然而,它只是将复杂性从添加方法修饰符转移到命名方法和添加魔法类修饰符

更改方法装饰器的名称和方法的名称是一个更好的主意

class ServiceDelegate(Service):
    @service
    def method1(self):
        super().method1()

    @service
    def method2(self):
        super().method2()

    @service
    def method3(self):
        super().method3()

省略
服务
前缀并添加
@service
完全不会更改键入字符的数量,并且不再需要magic class decorator。

有人使用此功能吗?:)有人在这上面吗?:)嗨,董宇轩,首先谢谢你的回答!是的,当然,方法和装饰器名称只是示例,而不是真正的实现。另外还要考虑到,我所说的类有很多方法,而不仅仅是3个(在我的具体案例中是120多个方法)。只有计算得到的方法我得到了40多个。我认为在这样的情况下,magic类decorator引入的复杂性是合理的。而且这个解决方案可以重复使用,因此好处更大。我只是觉得可能有一些我不知道的风险。嗨@董宇轩,首先谢谢你的回答!是的,当然,方法和装饰器名称只是示例,而不是真正的实现。另外还要考虑到,我所说的类有很多方法,而不仅仅是3个(在我的具体案例中是120多个方法)。只有计算得到的方法我得到了40多个。我认为在这样的情况下,magic类decorator引入的复杂性是合理的。而且这个解决方案可以重复使用,因此好处更大。我只是觉得可能存在一些我不知道的风险。