Skip to main content
 首页 » 编程设计

python之修改类中多个方法的调用参数

2025年05月04日18qq78292959

我有一个类,它有(太多)很多方法。大多数方法都有一个参数(总是同名)——我需要将参数的类型更改为其他类型,但也想接受参数的“旧”版本(和 raise DeprecationWarning)。

编辑:我们可以假设参数总是作为关键字参数传递。

最DRY的方法是什么?

我想到的第一个解决方案是这样的:

def check_orc(orc): 
    if isinstance(Snaga, orc): 
        orc = convert_to_urukhai(orc) 
        raise DeprecationWarning("You should not be sending snaga to combat") 
    return orc 
 
class Warrior(): 
    def slash_orc(sword, shield, opponent): 
       opponent = check_orc(opponent) 
       ... 
 
    def hack_orc(warhammer, opponent): 
       opponent = check_orc(opponent) 
       ... 

请您参考如下方法:

avasal 的评论是正确的。然而,出于教育目的,这里是您想要的装饰器实现:

from functools import wraps 
 
def convert_orc(f): 
    @wraps(f) 
    def wrapper(self, opponent, *args, **kwargs): 
        if isinstance(Snaga, orc): 
            raise DeprecationWarning(...) 
            return f(self, convert_to_urukhai(opponent), *args, **kwargs) 
        else: 
            return f(self, opponent, *args, **kwargs) 
    return wrapper 
 
class Warrior(): 
    @convert_orc 
    def slash_orc(self, opponent, sword, shield): 
       ... 
 
    @convert_orc 
    def hack_orc(self, opponent, warhammer): 
       ... 

注意:我把opponent移到了参数的第一个位置