使用 __getattr__ 覆盖魔术方法

2023-11-29

我有一个类,它是成员的容器。所有成员都属于同一类型。

class A(int):
    def __init__(self, n):
        super().__init__()
        self.n = n

    def do(self):
        print('adding 10')
        return self.n + 10


class B:
    def __init__(self, a1, a2):
        self.a = [a1, a2]

    def __getattr__(self, item):
        return getattr(self.a[0], item)


a1 = A(10)
a2 = A(5)
b = B(a1, a2)

the __getattr__覆盖do method:

In[7]: b.do()
adding 10
Out[7]: 20

甚至覆盖__add__当显式调用时

In[8]: b.__add__(1)
Out[8]: 11

but __add__调用时失败+

In[9]: b+1
TypeError: unsupported operand type(s) for +: 'B' and 'int'

如何重写魔术方法以按预期工作?


运营商不处理的原因__getattr__被覆盖在为什么 __getattr__ 能够处理 python 2.x 中的内置运算符重载?

在新式类中,特殊方法总是在类中查找(隐式查找)而不是实例中。

我的解决方法(并不完美,但允许使其工作)是在中显式定义所需的 dunder 方法B,并显式调用__getattr__在他们:

class B:
    def __init__(self, a1, a2):
        self.a = [a1, a2]

    def __add__(self,other):
        return self.__getattr__("__add__")(other)

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

使用 __getattr__ 覆盖魔术方法 的相关文章

随机推荐

  • 将csv数据转换为数组格式

    我正在尝试使用jquery 形成一个wordCloud 我有一个 csv 文件需要读取并使用该数据形成一个 wordCloud 我的 csv 文件中有列 text weight Lorem 15 Ipsum 9 等等 但输入数据需要采用以下
  • Protobuf-net .proto 文件生成用于继承

    我正在对 Protobuf net 进行原型设计 以替换我们现有的一些 C 代码 该代码当前正在使用 Datacontract 将对象序列化为 Xml 使用protobuffer我们可以轻松地与Java共享数据 因此 我对 Protobuf
  • scipy.spatial.ckdtree 运行缓慢

    我一直在使用spatial cKDTree in scipy计算点之间的距离 对于我的典型数据集 查找约 1000 个点到约 1e6 点数组的距离 它总是运行得非常快 约 1 秒 我在 Ubuntu 14 10 的计算机上以 python
  • iPhone 本地化 - 某些本地化的 XIB 无法加载

    我制作了一个具有本地化版本的 iPhone 应用程序 它大部分工作正常 但有两个视图无法加载本地化 NIB 使用标准 NIB 英文 我确信我正确地进行了本地化 获取信息 使文件可本地化 添加本地化 添加 pl 波兰语 然后编辑创建的 NIB
  • 替换嵌套数组 ruby​​ 中的元素

    我无法在代码中找到问题所在 如果特定元素出现在宾果板上 我想用 X 替换它们 class BingoBoard def initialize board bingo board board end def number letter let
  • 如何在C++中默认初始化内置类型的局部变量?

    如何在 C 中默认初始化原始类型的局部变量 例如 如果 a 有一个 typedef typedef unsigned char boolean that s Microsoft RPC runtime typedef 我想更改以下行 boo
  • 从 N 个数中找出最大和第二大的数

    给定 n 个数字 如何使用最多 n log n 次比较找到最大和第二大数字 请注意 这不是 O n log n 而是真正的 n log n 次比较 帕杰顿发表了评论 让我详细说明一下 正如帕杰顿所说 这可以通过锦标赛选择来完成 可以将其视为
  • 移动返回时调用的构造函数而不是复制

    今天我发现这段代码并没有像我期望的那样工作 根据我的知识 对于 L 值 应该调用复制构造函数 而对于 R 值 应该选择移动构造函数 否则目的何在std move它实际上什么也不做 只是转换为 R 值 我正期待着return obj将调用复制
  • GROUP BY DESC 如何选择顺序?

    所以我正在为一家商店创建部分 如果没有 商店可以有多个范围section identifier为给定设置store id它应该回退到全局商店0 我想要的 SQL 命令应该返回一个列表section options对于任何相关的给定商店 我的
  • 按行与按列访问矩阵元素

    一个矩阵A i j 给出 如果我们想将矩阵的元素相加 哪种方法更好 为什么 列明智 row wise 从我的角度来看 行方式更好 因为在数组表示中元素存储在连续的内存位置中 因此访问它们需要更少的时间 但是由于在 RAM 中获取每个位置需要
  • 单击按钮循环浏览 Jlabel 图像时出现 for 循环问题

    在java应用程序中 我有一个Jlabel 每次单击按钮时我想为其分配一个新图像 使用for循环我可以让它只显示最后一个图像 跳过图像之间的所有图像 我知道有一个错误按照我的逻辑 也许我不应该使用 for 循环 任何建议 private S
  • 捕获信号时强制终端不打印 Ctrl 热键

    再会 我正在为我的学校用 C 语言编写自己的 shell 它必须类似于bash尽可能接近 我必须处理 Ctrl 和 Ctrl C 等信号bash做 因此我可以使用signal功能 它工作正常 但问题是每当捕获 Ctrl C 信号时 从第二个
  • Json 对象的最大长度 Asp.net Core 3.1

    虽然这是大约两年前提出的问题 但我仍然面临着这个问题 而且没有办法摆脱它 有没有办法在 Asp net Core 3 1 中设置 JSON 对象的最大大小 在除 Net core 之外的其他 Net 框架中 有一些方法可以做到这一点 或者我
  • 在 Heroku 上的 Rails 应用程序中使用 COPY FROM 和 Postgresql 后端

    我想让用户可以选择在 Ruby on Rails 3 2 应用程序中上传文件 并将数据存入数据库 我想用COPY FROM命令 因为它比插入 ruby 对象更快 If I do User connection execute COPY us
  • 如何在php中通过特殊字符连接两个数组元素值?

    我有两个数组如下 Array 0 gt 2013 07 09 1 gt 2013 07 16 2 gt 2013 07 23 3 gt 2013 07 30 Array 0 gt 2013 07 16 1 gt 2013 07 23 2 g
  • Mongodb 多重嵌套数组搜索

    我的目标是搜索数据userid 1的记录 以下是我的数据 id 2 name test data id 1 file nic userid 1 2 id 2 file nic1 userid 1 id 3 file nick2 userid
  • 单击元素角度 4 外部时隐藏

    我为垂直导航创建了一个侧面菜单 因此我在单击时切换侧面菜单 我需要在单击该菜单之外的任何位置时关闭该菜单 我尝试安装 https github com chliebel angular2 click outside 但由于某种原因它不起作用
  • Spring AOP 在 Java 8 中给出 IllegalArgumentException

    使用 Java 8 和 Spring AOP 4 0 6 我收到以下错误 java lang RuntimeException Error scanning file MonitorAroundPerformance class at or
  • 提交和重定向后输入字段未清空?

    当我想从 jsf 页面 删除飞机 时 如果成功删除飞机 我会重定向到该页面并显示一条警报 告诉用户飞机已成功删除 但是 用户在 h inputText 中输入的值仍然存在 它们不是空的 JSF 页面
  • 使用 __getattr__ 覆盖魔术方法

    我有一个类 它是成员的容器 所有成员都属于同一类型 class A int def init self n super init self n n def do self print adding 10 return self n 10 c