【发布时间】:2018-06-08 19:01:57
【问题描述】:
代码:
>>> class Negative:
... pass
>>> class Positive:
... @classmethod
... def __neg__(cls):
... return Negative
所以我试试
>>> -Positive is Negative
TypeError: bad operand type for unary -: 'type'
这可行
>>> -Positive() is Negative
True
其他一元运算符及其相关的“魔术”方法(例如~ 和__invert__、+ 和__pos__ 等)也是如此。
为什么它适用于实例而不适用于类?我怎样才能让它工作?
编辑:我已按照建议修改了代码,以便在元类中移动魔法方法。
class Negative: pass
class PositiveMeta(type):
def __neg__(cls):
return Negative
class Positive(metaclass=PositiveMeta): pass
【问题讨论】:
-
类的类是它的元类。在自定义元类中定义方法,而不是在类方法中。魔术方法只有在类中定义时才会被识别。
-
@Jean-FrançoisFabre 为什么不呢?他们只需要进入一个元类才能生效。
-
事实上,这可能并不局限于一元运算符。如果您在元类中定义适当的方法,您可能可以将类添加和相乘。
-
@MadPhysicist:是的,它有效。我认为我的问题是我最初将 Python2 元类语法与 Python3 混合在一起。谢谢
-
不错。 Python 面向对象的绝对威严从未停止让我惊讶。 Go apeshit:为你的类定义一些二元运算符。让它们相互除以指数。