如何为 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'>
在 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'>