python一元运算符_让一元运算符使用Python类

您的代码不能像最初编写的那样工作的原因是您无法在实例中定义魔术方法.根据

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

现在你可以使用>运算符来比较您的类.我并不是说你应该做那样的事情,但肯定存在这种可能性.

问题仍然存在,就像往常一样,为什么你想要首先做这样的事情.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值