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

分配(而不是定义)__ getitem__Magic Methods会破坏索引

丁毅庵
2023-03-14
问题内容

我有一个类似于以下示例(非常简化)的包装器类:

class wrap(object):
    def __init__(self):
        self._data = range(10)

    def __getitem__(self, key):
        return self._data.__getitem__(key)

我可以这样使用它:

w = wrap()
print w[2] # yields "2"

我以为可以通过更改为以下内容来优化并摆脱一个函数调用:

class wrap(object):
    def __init__(self):
        self._data = range(10)
        self.__getitem__ = self._data.__getitem__

但是,我收到

TypeError:“包装”对象不支持索引

对于print w[2]后者的版本线。

直接调用该方法(即)print w.__getitem__(2)在两种情况下均有效…

为什么分配版本不允许索引?


问题答案:

必须在类上定义特殊方法(基本上是两端都带有两个下划线的任何方法)。特殊方法的内部查找过程完全跳过了实例字典。除其他外,如果您这样做

class Foo(object):
    def __repr__(self):
        return 'Foo()'

__repr__您定义的方法仅用于的实例Foo,而不用于repr(Foo)



 类似资料:
  • 问题内容: 我正在尝试找到一种方法来实现自定义和自定义而不破坏DRY。这是我到目前为止所拥有的: 在我做这样的事情之前,它可以正常工作: 这会立即破坏所有内容,因为的方法与的方法不同。我尝试过创建一个自定义QuerySet类,并在中实现它,但最终我复制了所有方法定义。 我也发现此代码片段有效,但是我需要将额外的参数传递给,因此它无法使用,因为它严重依赖于重新定义。 有没有一种方法可以在不重新定义子

  • 编辑1: 我目前从一个Main类调用它,如下所示: } 原文: 解释后代码如下: 我有一个带有JavaConfig的Spring应用程序,称之为主应用程序,它从库中导入另一个Spring JavaConfig类。这个导入的JavaConfig应该用一个方面包装在主应用程序中创建的任何数据源,这个方面有一个自动连接的LogDelegator。 只要主应用程序只包含一个数据源,一切都正常。但是,当我向

  • 问题内容: 我在postgres中使用表继承,但是我用来将数据分区到子表中的触发器的行为不太正确。例如,此查询返回nil,但我希望它返回新记录的。 如果将触发器函数的返回值从更改为,则会得到所需的行为,但是随后在数据库中插入了两个相同的行。这是有道理的,因为来自触发器函数的非空返回值会导致原始语句执行,而返回NULL会导致语句停止执行。唯一索引可能会中止第二次插入,但可能会引发错误。 有什么想法如

  • 对于Oracle池连接,我使用,但这些连接似乎在数据库中保持活动状态。今天我在连接到Oracle数据库时遇到了一个错误: ORA-12516:TNS:侦听器找不到具有匹配协议栈的可用处理程序 另外,我在dao级别使用jdk7 try-with-resources语法进行连接: 弄不清真正的问题在哪里。我应该使用c3p0而不是OracleDataSource吗?ojdbc7中是否有bug或我的代码中

  • 问题内容: 我听过关于此主题的不同回答,那么销毁PHP会话的肯定方法是什么? 在最简单的情况下,这是否足以真正终止用户与服务器之间的会话? 问题答案: 要销毁会话,您应该采取以下步骤: 删除会话数据 使会话ID无效 为此,我将使用以下代码: 为了确保会话ID无效,您应该只允许脚本启动的会话ID。因此,设置一个标志并检查它是否被设置: 此外,您可以使用此时间戳定期交换会话ID,以缩短其寿命:

  • 问题内容: 我需要调整动画GIF文件的大小而不破坏动画。 如何使用PHP做到这一点? 问题答案: 如果您具有imagemagick访问权限,则可以执行以下操作: 如果您没有system()访问权限,则最有可能使用imagemagick插件 注意:这可能会产生较大的文件大小,但图像尺寸较小,这是由于合并会导致图像的最佳性能下降。 这肯定比ImageMagick路线要密集得多,但从技术上讲应该是可以的