当前位置: 首页 > 面试题库 >

Python-覆盖实例上的特殊方法

怀浩大
2023-03-14
问题内容

我希望有人能够回答这个对Python有深刻理解的问题

考虑以下代码:

>>> class A(object):
...     pass
...
>>> def __repr__(self):
...     return "A"
...
>>> from types import MethodType
>>> a = A()
>>> a
<__main__.A object at 0x00AC6990>
>>> repr(a)
'<__main__.A object at 0x00AC6990>'
>>> setattr(a, "__repr__", MethodType(__repr__, a, a.__class__))
>>> a
<__main__.A object at 0x00AC6990>
>>> repr(a)
'<__main__.A object at 0x00AC6990>'
>>>

注意repr(a)如何不会产生“ A”的预期结果?我想知道为什么会这样,是否有办法实现这一目标…

相比之下,下面的示例仍然有效(也许是因为我们不打算重写特殊方法吗?):

>>> class A(object):
...     def foo(self):
...             return "foo"
...
>>> def bar(self):
...     return "bar"
...
>>> from types import MethodType
>>> a = A()
>>> a.foo()
'foo'
>>> setattr(a, "foo", MethodType(bar, a, a.__class__))
>>> a.foo()
'bar'
>>>

问题答案:

Python不会调用特殊方法,那些__在实例上带有名称包围的特殊方法,而仅在类上,显然可以提高性能。因此,无法__repr__()直接在实例上进行覆盖并使其起作用。相反,你需要执行以下操作:

class A(object):
    def __repr__(self):
        return self._repr()
    def _repr(self):
        return object.__repr__(self)

现在,你可以__repr__()通过替换替代实例_repr()



 类似资料:
  • 问题内容: 我知道调用类的实例时会触发类中的方法。但是,我不知道何时可以使用此特殊方法,因为一个人可以简单地创建一个新方法并执行在方法中完成的相同操作,而无需调用实例,而可以调用该方法。 如果有人给我这种特殊方法的实际用法,我将不胜感激。 问题答案: Django表单模块很好地使用了方法来实现用于表单验证的一致API。您可以将自己的表单验证程序编写为Django中的函数。 Django有一些默认的

  • 问题内容: 我想覆盖我无法控制的工厂提供给我的对象中的方法。 我的具体问题是,我想覆盖 的getInputStream 和 getOutputStream方法 一的 Socket对象 进行 线记录 。 通用问题如下: 我想实例化并用我自己的实例替换的位置,如下所示: 对于套接字,我将返回一个 InputStream 和 OutputStream ,它们通过记录来包装以拦截数据。 问题答案: 由于J

  • 本文向大家介绍Java中覆盖finalize()方法实例代码,包括了Java中覆盖finalize()方法实例代码的使用技巧和注意事项,需要的朋友参考一下 本文研究的主要是Java中关于覆盖finalize()方法的一次尝试,具体实现如下。 测试代码 执行结果: finalize methode executed yes,i am still alive Exception in thread "

  • 问题内容: 是否可以在Python中覆盖+ =? 问题答案: 是的,重写该方法。例:

  • 我定义了一个通用的环境特征: 为此,我提供了以下实现: 此外,我定义了一个通用事件特征,该特征具有一个接受通用环境作为参数的方法: 对于这个事件特征,我提供了以下实现,其中exec()方法接受MyEnvironment类型的参数,使我能够访问MyEnvironment的特定值。 然而,Scala编译器输出了一个错误,从中可以看出MyEnvironment似乎没有被识别为环境[整数]: 错误:方法e

  • 问题内容: 我想为 isEmpty 方法添加自定义行为。 当我从 我应该重写序列化方法,因为它是抽象的。 我想按原样保留序列化方法,并仅覆盖isEmpty方法。 问题答案: 为了修改行为但保持默认的序列化,您可以利用 serializer修饰符 。您仍然必须实现自定义序列化程序,但是可以非常干净地利用默认序列化程序。 使用默认的序列化器创建一个自定义序列化器 将变量插入到您的自定义序列化器类中。当