也许我可以使OldClsName一个发出警告(记录)并根据其参数构造NewClsName对象(使用 args和*
kvargs)的函数,但是它看起来不够优雅(或者也许是?)。
是的,我认为这是非常标准的做法:
def OldClsName(*args, **kwargs): from warnings import warn warn("get with the program!") return NewClsName(*args, **kwargs)
唯一棘手的事情是,如果您拥有某些子类,
OldClsName那么我们就必须变得聪明。如果只需要继续访问类方法,则应该这样做:
class DeprecationHelper(object): def __init__(self, new_target): self.new_target = new_target def _warn(self): from warnings import warn warn("Get with the program!") def __call__(self, *args, **kwargs): self._warn() return self.new_target(*args, **kwargs) def __getattr__(self, attr): self._warn() return getattr(self.new_target, attr)OldClsName = DeprecationHelper(NewClsName)
我还没有测试过,但这应该可以给您一个想法-
__call__处理正常实例化路线,
__getattr__捕获对类方法的访问并仍然生成警告,而不会弄乱您的类层次结构。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)