Python中给类中属性更换名称

文章介绍了如何在Python类中使用代理方法来实现属性和方法的重命名,同时在访问旧名称时发出弃用警告,以实现向后兼容的代码重构。通过`renamed_attr`函数,可以轻松地将`new_value`和`new_func`替换为`old_value`和`old_func`,而无需修改原有代码。
摘要由CSDN通过智能技术生成

如题,在实际代码中,有时候会遇到一种更换类中属性的名称,比如:

       class Example(object):
            new_value = "foo"
            def new_func(self, a, b):
                return a + b

里面有两个属性,new_value和new_func,我们想换成其它名字,该怎么办。如下:

class renamed_attr(object):

    """Proxy for renamed attributes (or methods) on classes.
    Getting and setting values will be redirected to the provided name,
    and warnings will be issues every time.

    """

    def __init__(self, new_name):
        self.new_name = new_name
        self._old_name = None

    def old_name(self, cls):
        if self._old_name is None:
            for k, v in vars(cls).items():
                if v is self:
                    self._old_name = k
                    break
        return self._old_name

    def __get__(self, instance, cls):
        old_name = self.old_name(cls)
        warnings.warn(
            "{0}.{1} is deprecated; please use {0}.{2}.".format(
                cls.__name__,
                old_name,
                self.new_name,
            ),
            AttributeRenamedWarning,
            stacklevel=2,
        )
        return getattr(instance if instance is not None else cls, self.new_name)

    def __set__(self, instance, value):
        old_name = self.old_name(instance.__class__)
        warnings.warn(
            "{0}.{1} is deprecated; please use {0}.{2}.".format(
                instance.__class__.__name__,
                old_name,
                self.new_name,
            ),
            AttributeRenamedWarning,
            stacklevel=2,
        )
        setattr(instance, self.new_name, value)

继续重新定义类:

        class Example(object):

            new_value = "foo"
            old_value = deprecation.renamed_attr("new_value")

            def new_func(self, a, b):
                return a + b

            old_func = deprecation.renamed_attr("new_func")

        obj = Example()

那么:

assertEqual(obj.old_value, "foo")
assertEqual(obj.old_func(1, 2), 3)

就这有很轻松的更换了名称,而不用修改原来的代码,只需要添加就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值