灵活的令人抓狂,如何在运行时修改某一个 Python 对象的类?

你好,我是 somenzz,可以叫我征哥。

这样的场景你也可能遇到:调试的时候,我需要追踪某一个 Python 对象的属性变化,比如对象 someobj = SomeClass(),当 someobj 添加了一个属性( someobj.age = 14)或者修改了属性的值 (someobj.age = 18)的时候,打印这些变化。

你可能会说,简单啊,我在类 SomeClass 的定义中,添加一个魔法函数__setattr__不就可以了:

class SomeClass:
    def __setattr__(self, name, value):
        old = getattr(self, name, 'Nothing')
        if old == 'Nothing':
            print(f"New attr: {name}{value!r}")
        else:
            print(f"Change attr: {name}{old!r} -> {value!r}")

        return super().__setattr__(name, value)

这样的问题是:所有这个类的所有对象都会打印这些新增或变化信息,在日志中会看到太多的信息输出,对调试代码产生干扰。

我们要解决的问题是如何在运行中,只修改某一个对象的类?

话不多说,先看代码:

灵活的令人抓狂,如何在运行时修改某一个 Python 对象的类?

上述代码运行结果:

灵活的令人抓狂,如何在运行时修改某一个 Python 对象的类?

重点在于第 22 行,通过对象的 __class__ 属性来运行时修改一个对象所属的类, Python 真是灵活到令人发狂。

最后的话

本文分享了如何在运行时修改某一个对象的类,可以帮助我们更好的调试代码,你也可以实现其他更高级的功能。如果有帮助,还请点赞、在看、转发支持,新来的朋友可以关注下,给你推送高质量的 Python 干货。

原文始发于微信公众号(Python七号):灵活的令人抓狂,如何在运行时修改某一个 Python 对象的类?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/39704.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!