【发布时间】:2013-09-24 03:17:58
【问题描述】:
如果我想查找对象的特殊方法,我可以在对象或其类型上进行。不过,这两个选项似乎都不正确。
def lookup_add(o):
return o.__add__
def lookup_sub(o):
return type(o).__sub__
class Foo(type):
def __add__(self, other):
return NotImplemented
def __sub__(self, other):
return NotImplemented
class Bar(object):
__metaclass__ = Foo
def __add__(self, other):
return NotImplemented
baz = Bar()
lookup_add(Bar) # Produces wrong method
lookup_sub(baz) # Should raise an error. Instead, produces wrong method.
lookup_add 在对象上查找它。它对lookup_add(baz) 正常工作,为baz 的方法返回一个绑定的方法对象,但它对lookup_add(Bar) 产生错误的结果。
lookup_sub 在类型上查找它。它对lookup_sub(Bar) 正常工作,为Bar 的方法返回一个未绑定的方法对象,但它对lookup_sub(baz) 产生错误的结果。
我可以尝试functools.partial(operator.add, o),但这并不能真正查找o 的方法。如果o 没有真正实现__add__,这个尝试不会产生我想要的错误。
有没有复制解释器特殊方法查找行为的好方法?
【问题讨论】:
-
正确的行为是什么?我不明白
lookup_add(Bar)是如何从类对象中获取绑定方法的。 -
非常有趣...很好奇如何解决这个问题。
-
@li.davidm:我想要一个函数,它为任何对象
o生成一个返回值,该返回值表示当您执行o + whatever时会调用的__add__方法,或者引发错误如果不存在这样的方法。结果是绑定方法还是未绑定方法并不重要。 (请注意,我知道__radd__和__iadd__;我特别想查找__add__。例如,选择__pos__或__neg__之类的方法可能会更好。)跨度> -
我明白了。所以
lookup_add(Bar)应该给你Bar.__add__(Class2),即Bar + Class2? -
您要解决的问题是什么?这是在寻找似乎没有问题的解决方案。
标签: python