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

在新型类中实现__getitem__

轩辕晔
2023-03-14
问题内容

我有以下代码:

class A:
    def __init__(self):
        def method(self, item):
            print self, ": Getting item", item
        self.__getitem__ = types.MethodType(method, self, self.__class__)

class B(object):
    def __init__(self):
        def method(self, item):
            print self, ": Getting item", item
        self.__getitem__ = types.MethodType(method, self, self.__class__)

然后工作正常:

a = A()
a[0]

但这不是:

b = B()
b[0]

引发TypeError。

我发现新型类在__dict__类而不是实例__dict__中寻找魔术方法。这是正确的吗?为什么会这样呢?您是否知道任何文章解释了背后的想法?我尝试过RTFM,但可能不是正确的方法,或者没有抓住问题…

非常感谢你!保罗


问题答案:

这在Python数据模型文档中进行了介绍:新型类的特殊方法查找:

对于新型类,只有在对对象的类型(而不是在对象的实例字典中)进行定义的情况下,才能保证对特殊方法的隐式调用可以正常工作。

此行为背后的原理在于许多特殊方法,例如__hash__()__repr__()由所有对象(包括类型对象)实现。如果这些方法的隐式查找使用常规查找过程,则在对类型对象本身[。]进行调用时它们将失败。

所以,因为两者hash(int)
hash(1)必须的工作,特殊的方法查找的类型,而不是实例上。如果__hash__()是在对象上抬头挺直,hash(int)将被转换为int.__hash__(),这将失败,因为int.__hash__()是一个未绑定的方法,它预计将被称为上的实际
情况int()(如1); 因此对于hash(int)type.__hash__()应改为:

>>> hash(1) == int.__hash__(1)
True
>>> hash(int) == type.__hash__(int)
True
>>> int.__hash__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: descriptor '__hash__' of 'int' object needs an argument

这是向后不兼容的更改,因此它仅适用于新型对象。



 类似资料:
  • 我有一个泛型类型,它将是事件系统中事件的基类。我们希望这些是单例,但它也是泛型的,以便子类可以在事件触发时指定它们在回调中期望的参数的类型。 我拥有的东西看起来像这样: 这里有些东西我认为很奇怪,主要是因为打字稿的语言要求。GetInstance的参数似乎是必要的,因为< code>var x = new TEvent()似乎不被TypeScript允许。空接口有助于加强什么可以被接受为泛型类型。

  • 问题内容: 谁能告诉我如何从字符串创建Type的新实例?反映? 有示例,但它们适用于语言[:(]的旧版本(Go 1之前的版本) 问题答案: 因此,如果我正确理解了您的问题,那么您在问的是,仅将类型名称作为字符串时,如何创建对象。因此,例如,您可能有一个字符串“ MyStruct”,并且想要创建这种类型的对象。 不幸的是,这是不容易实现的,因为Go是一种静态类型的语言,并且链接程序将消除无效代码(或

  • 问题内容: 我在编写的程序中遇到接口问题。我想创建一个接口,该接口的方法之一可以接收/返回对自己对象类型的引用。就像这样: 我不能在“?”处使用“ I”,因为我不想返回对接口的引用,而是要返回对类的引用。我搜索后发现在Java中没有“自我引用”的方法,因此我不能仅用“?”代替。在示例中,“ self”关键字或类似的内容。实际上,我想出了一个解决方案 但这似乎确实是一种解决方法或类似方法。还有另一种

  • 我被分配了一个问题:编写一个通用的加权元素 到目前为止,我已经创建了类并实现了Compariable,但在为W创建compareTo()方法时遇到了问题。我有: 我遇到的问题是,当我比较权重时,没有找到数据的权重。还有没有其他我必须创建的方法来正确地拥有一个在其中一个变量上实现可比较的类?谢谢你的帮助

  • 问题内容: 我想在Java中创建泛型类型的对象。请提出如何实现相同的建议。 注意:这似乎是一个简单的泛型问题。但是我打赌..不是。:) 假设我的类声明为: 问题答案: 你必须添加异常处理。 你必须在运行时传递实际类型,因为它不是编译后字节码的一部分,因此,没有显式提供它就无法知道它。