为什么索引操作不调用 __getattr__ ?

2024-05-05

我的问题:

看起来__getattr__不调用索引操作,即我不能使用__getattr__在课堂上A提供A[...]。是否有一个原因?或者一种绕过它的方法__getattr__可以提供该功能而无需显式定义__getitem__, __setitem__A?

最小示例:

假设我定义了两个几乎相同的类,Explicit and Implicit。每个人都会创建一个小列表self._arr在启动时,每个都定义了一个__getattr__只是将所有属性请求传递给self._arr。唯一的区别是Explicit还定义了__getitem__(只需将其传递给self._arr).

# Passes all attribute requests on to a list it contains
class Explicit():
   def __init__(self):
        self._arr=[1,2,3,4]
    def __getattr__(self,attr):
        print('called __getattr_')
        return getattr(self._arr,attr)
    def __getitem__(self,item):
        return self._arr[item]

# Same as above but __getitem__ not defined
class Implicit():
    def __init__(self):
        self._arr=[1,2,3,4]
    def __getattr__(self,attr):
        print('called __getattr_')
        return getattr(self._arr,attr)

这按预期工作:

>>> e=Explicit()
>>> print(e.copy())
called __getattr_
[1, 2, 3, 4]
>>> print(hasattr(e,'__getitem__'))
True
>>> print(e[0])
1

但这并没有:

>>> i=Implicit()
>>> print(i.copy())
called __getattr_
[1, 2, 3, 4]
>>> print(hasattr(i,'__getitem__'))
called __getattr_
True
>>> print(i.__getitem__(0))
called __getattr_
1
>>> print(i[0])
TypeError: 'Implicit' object does not support indexing

Python绕过__getattr__, __getattribute__,以及查找用于实现语言机制的“特殊”方法时的实例字典。 (在大多数情况下,特殊方法是名称两侧各有两个下划线的方法。)如果您期望i[0]调用i.__getitem__(0),这又会调用i.__getattr__('__getitem__')(0),这就是为什么那没有发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么索引操作不调用 __getattr__ ? 的相关文章

随机推荐

  • 如何使用正则表达式替换匹配的组值

    我想修改连接字符串中 数据源 组件的值 我正在考虑以下解决方案 使用这个正则表达式模式 data source w 1 w 我可以获得以下字符串匹配 Match Groups 0 Value data source MY PC SQLEXP
  • GCD获取队列名称/标签

    如何获取当前队列名称 我的意思是队列标签com example myqueue 在 Xcode 4 调试器中我只能看到 block invoke 1 怎么样dispatch queue get label http developer ap
  • 运行时 SQL 查询生成器

    我的问题类似于 Java中有什么好的动态SQL生成器库吗 https stackoverflow com questions 5620985 is there any good dynamic sql builder library in
  • aspnet webforms禁用提交按钮

    我在 Webforms 中遇到一个小问题 我正在尝试禁用提交时的提交按钮 以防止重复发布 问题是 如果在回发期间禁用提交按钮 则不会调用代码隐藏中的 onclick 方法 回发仍然发生 但按钮 onclick 方法不会被调用 有办法解决这个
  • 如何设计多租户mysql数据库[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我需要设计一个数据库来托管多个公司的数据 现在 出于安全和管理目的 我需要确保不同公司的数据正确隔离 但我也不想启动 10 个 m
  • 如何使用 ASP.NET Core 进行流式传输

    如何在 ASP NET Core 中正确传输响应 有一个像这样的控制器 更新的代码 HttpGet test public async Task GetTest HttpContext Response ContentType text p
  • WCF服务契约上的数据注释

    我有一个 WCF 服务 其中定义了一个 DataContract 类 每个属性都有 DataMember 属性 并且我已向其中几个属性添加了几个数据注释属性 Required 和 StringLength 然后 我在 ASP NET MVC
  • Javascript 中左侧的可选链接

    是否可以使用可选链接 https developer mozilla org en US docs Web JavaScript Reference Operators Optional chaining运算符位于赋值的左侧 在 JavaS
  • 为 UILabel 设置不同字体的问题

    我想将字体大小和姓氏设置为 titleLabel Helvetica Neue UltraLight titleLabel setFont UIFont fontWithName Helvetica Neue UltraLight size
  • 如何允许Windows Server上的MySQL进行外部远程访问?

    我已经在我的 Windows Server 2008 R2 上安装了 xampp 我在那里运行一个脚本来存储当天的数据 现在我想通过 mysql connect hostname username pw 连接数据库从我自己的计算机或外部检索
  • 绝对定位的元素如何在没有任何 z-index 的情况下与后续/下一个元素重叠?

    请看我的fiddle http jsfiddle net CNKsx here 我试图了解绝对定位的 红色六边形 图标如何在没有 z index 的情况下与 input textarea 元素重叠
  • 如何在android aidl 文件中返回MyObject 列表?

    我的 aidl 文件中有这个方法 void getObjects out List
  • 如何从 colorbox 获取返回值?

    我有一个颜色框 可以让用户选择图像 如何从颜色盒中获取文件名 我注意到onClosed功能 解决方案 正如 Gummy 所建议的 我使用了 onComplete 函数 如以下代码所示 返回 页面
  • 如何找到哪个 rspec 测试花费了这么长时间

    我们的一个 或几个 测试花费了很长时间 我们希望对其进行优化 我们已经进行了 1000 次测试 因此对我来说运行每个文件是不切实际的 有没有一种简单的方法可以找到慢的 这是 rspec 1 3 在 RSpec 2 和 3 中 您可以使用 p
  • 如何让图片在div中居中?

    我的 HTML 代码如下所示 div class ctn img src some img jpg div The ctn应该是固定大小 例如 150 150 但 IMG 的尺寸可能更大或更小 200 50 50 200 50 50 等 如
  • 非聚合查询内部的聚合情况

    我有一个相当大的查询 其最简单的形式如下所示 select r rep id u user id u signup date pi application date pi management date aum from table1 r
  • Flutter 中的 SharedPreferences 错误

    我正在使用shared preferences我的 Flutter 应用程序中的插件 从某个时刻开始 可能是在 Flutter 升级之后 它开始抛出异常 E flutter 27778 ERROR topaz lib tonic loggi
  • 如何使用 angularjs 更改 iframe src

    p Your browser does not support iframes p 如何修改iframe的src 你还需要 sce trustAsResourceUrl否则它不会打开 iframe 内的网站 JSFiddle http js
  • 泛型函数的不同实例是否可以具有不同的静态变量?

    当我在泛型函数中使用静态变量时 泛型函数的每个实例中的变量实体都是相同的 例如 在这段代码中 fn foo
  • 为什么索引操作不调用 __getattr__ ?

    我的问题 看起来 getattr 不调用索引操作 即我不能使用 getattr 在课堂上A提供A 是否有一个原因 或者一种绕过它的方法 getattr 可以提供该功能而无需显式定义 getitem setitem 等A 最小示例 假设我定义