如何为 Python class 而不是其实例定义运算符

How to define an operator for a Python class, rather than its instances

在 Python 中,我可以为我的 class:

实例定义 "plus" 运算符的行为
class A:
    def __add__(self, x):
        return f"adding {x}"

A() + 3 # returns "adding 3"

但是如何为我的 class 本身定义一个运算符呢?通常我会使用 @classmethod@staticmethod 装饰器:

class A:
    @classmethod
    def __add__(cls, x):
        return f"adding {x} to {cls}"

print(A + 1)

但是不行:

Traceback (most recent call last):
  File "class_operator.py", line 6, in <module>
    print(A + 1)
TypeError: unsupported operand type(s) for +: 'type' and 'int'

我怎样才能使该代码起作用?

此问题在 Python 的参考文档中有所描述:https://docs.python.org/3/reference/datamodel.html#special-method-lookup

您必须使用元类,而不是使用 @classmethod 装饰器:

class A(type):
    def __add__(cls, x):
        return f"Adding {x} to {cls}"


class B(metaclass=A):
    pass


print(B + 1) # prints: Adding 1 to <class '__main__.B'>