首页 > 后端开发 > Python教程 > 为什么我不能直接在 Python 实例上重写特殊方法?

为什么我不能直接在 Python 实例上重写特殊方法?

Patricia Arquette
发布: 2024-11-28 22:14:11
原创
803 人浏览过

Why Can't I Override Special Methods Directly on Python Instances?

重写实例上的特殊方法:探索

想象一种情况,您有一个类的实例,并且希望修改它特殊方法,例如 __repr__()。尝试重写这些方法时,您可能会遇到意外行为。

为了说明这一点,请考虑以下代码:

class A(object):
    pass

def __repr__(self):
    return "A"

from types import MethodType
a = A()
登录后复制

调用 repr(a) 时,您期望获得“A ,”鉴于 repr 已被覆盖。然而,结果并不如预期。

这种差异源于Python调用特殊方法的方式。通常,Python 仅对类本身执行特殊方法,而不对其实例执行特殊方法。因此,直接在实例上覆盖 repr 是无效的。

要克服此限制,请考虑以下方法:

class A(object):
    def __repr__(self):
        return self._repr()
    def _repr(self):
        return object.__repr__(self)
登录后复制

在此修改后的代码中,实例上的 repr 可以通过替换来覆盖_repr().

将此行为与以下代码片段进行对比,举例说明了重写特殊方法和常规方法之间的区别:

class A(object):
    def foo(self):
        return "foo"

def bar(self):
    return "bar"

a = A()
setattr(a, "foo", MethodType(bar, a, a.__class__))
登录后复制

在本例中,foo实例上的特殊方法已成功重写。然而,值得注意的是,这种能力是常规方法所独有的。

以上是为什么我不能直接在 Python 实例上重写特殊方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板