python - 如何在 Python 中将兔子添加到数字中?

标签 python magic-methods

我可以在 Rabbit 类中添加一个数字,但反过来不行:

class Rabbit:

    def __init__(self, age):
        self.age = age

    def __add__(self, rabbit):
        if isinstance(rabbit, int):
            return self.age + rabbit
        else:
            return self.age + rabbit.age

print(Rabbit(10) + 5)
print(5 + Rabbit(10))

最后一行返回:
TypeError: unsupported operand type(s) for +: 'int' and 'Rabbit'

那是因为在第一个打印表达式(有效)中 Rabbit.__add__被称为地下,而在第二个表达式中 int.__add__被称为 int.__add__方法不适用于兔子。完成这项工作的最佳方法是什么?我希望能够将整数添加到兔子和兔子到整数。

最佳答案

关于 Emulating numeric types 的文档这是你需要的:

  • 方法__add__是当左边的实例来自类时,这里你处理右边的实例,它可以来自类或其他
  • 方法__radd__是当正确的实例不是来自类而左实例是时,您在此处

  • 你需要
    def __radd__(self, value):
        if isinstance(value, int):
            return self.age + value
        print("Other type", type(value)) # handle non-int as you want
    

    给予
    print(Rabbit(10) + 5)         # add 15
    print(Rabbit(10) + Rabbit(5)) # add 15
    print(5 + Rabbit(10))         # radd 15
    print(5.2 + Rabbit(10))       # radd 'Other type float'
    

    关于python - 如何在 Python 中将兔子添加到数字中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61608947/

    相关文章:

    python - Python 的内置类型是否有多余的特殊方法?

    Python __index__ 特殊方法

    php - Codeigniter 使用 Controller 魔术方法 __call 进行路由行为

    python - 如何从零件列表构建 URL 路径?

    python - 如何调试静默崩溃?多处理python

    python - 将具有不同键的字典列表转换为值字符串列表

    python - 如何根据scrapy中本周的日期获取上周作为开始日期和结束日期

    python - 在 HostedZone 资源的 Lambda 函数中指定名称服务器?

    python - 我可以更改 Python 中默认的 __add__ 方法吗?

    php - 使用魔法方法有什么缺点?如何在 child 类(class)中缩写它们?