【发布时间】:2019-06-24 10:21:21
【问题描述】:
考虑根据某些参数的值添加方法的此类:
class Something(object):
def __init__(self, value, op='+'):
self.x = value
if op == '+':
self.add = self._operator
elif op == '-':
self.sub = self._operator
def _operator(self, other):
return self.x * other
x = Something(10)
x.add(3)
# 30
现在,我想使用 + 和 - 运算符而不是 .add() 或 .sub() 表示法。
为此,我会写:
class Something(object):
def __init__(self, value, op='+'):
self.x = value
if op == '+':
self.__add__ = self._operator
self.__radd__ = self._operator
elif op == '-':
self.__sub__ = self._operator
self.__rsub__ = self._operator
def _operator(self, other):
return self.x * other
x = Something(10)
print(x + 3)
但我得到的不是30,而是:
TypeError: +: 'Something' 和 'int' 的操作数类型不受支持
尽管:
print(dir(x))
# ['__add__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_operator', 'x']
出了什么问题,我该如何解决?
编辑
这与Overriding special methods on an instance 的不同之处在于,我不是在创建对象后尝试向对象的实例添加特殊方法,即:
x = Something(10)
x.__add__ = ...
但在class.__init__() 期间,尽管无可否认,错误的来源和解决方案都非常相似。
【问题讨论】: