您的代码不能像最初编写的那样工作的原因是您无法在实例中定义魔术方法.根据
docs:
For custom classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary.
使用@classmethod来装饰你的魔法方法与将通过__get__获得的绑定方法分配给实例是一样的.在这两种情况下,Python都会忽略任何未在类中定义的描述符.
这也是-Positive()是负面作品的原因.当你否定一个Positive实例时,解释器会在类中查找__neg__.使用@classmethod进行装饰在这里完全是多余的,因为无论如何你都忽略了输入参数.但是现在你有了一个返回类对象的魔术方法.
要在类对象上正确定义魔术方法,需要在元类上定义它:
class MetaPositive(type):
def __neg__(self):
return Negative
class Negative: pass
class Positive(metaclass=MetaPositive): pass
这里有趣的是,这不仅限于一元运算符.您可以在元类上定义任何dunder方法,并让您的类支持相应的操作:
class MetaPositive(type):
def __gt__(self, other):
if other is Negative:
return True
return False
现在你可以使用>运算符来比较您的类.我并不是说你应该做那样的事情,但肯定存在这种可能性.
问题仍然存在,就像往常一样,为什么你想要首先做这样的事情.

1040

被折叠的 条评论
为什么被折叠?



