我有一个像这样的python类:
class TAG_Short(NBTTag):
def __init__(self, value=None):
self.name = None
self.value = value
def __repr__(self):
return "TAG_Short: %i" % self.value
此标记在运行时填写,但我也希望能够像:
一样使用它mytag = TAG_Short(3)
mycalc = 3 + ( mytag % 2) / mytag
我需要在标签中添加任何方法以允许我将其用作有效的数字类型吗?
答案 0 :(得分:4)
你必须重载一些运算符。对于您提供的示例,这些是您应该重载的方法:
def __add__(self, other):
return self.value + other
def __mod__(self, other):
return self.value % other
def __rdiv__(self, other):
return other / self.value
有关其他信息,请参阅this guide
答案 1 :(得分:3)
我明白了 - 你想要的是__as_number__
方法,你可以在TAG_Short
中定义,这将允许你返回一个数字,然后在任何地方使用ValueError
即将被提升。我不知道是否有任何办法可以做这样的事情,而不是自己实现这种元特征。
可以做的是定义__add__
,__radd__
,__mul__
,__rmul__
等等(如果你必须定义每个数字方法)希望你的对象在每种情况下都真正表现得像一个数字),并让每个对象返回使用你认为是TAG_Short
对象的数字表示的所需操作的结果。
如果你发现自己经常这样做,你可以考虑实现你描述的元特征(或者首先寻找一个稳定的实现来重用)。在Python中它是完全可行的。我认为它甚至可以像一个老式的类一样容易继承(未经测试的代码跟随),有点类似:
class AbstractNumberImpersonator:
# child classes should define method .to_number()
def __add__( self, other ):
return self.to_number() + other
__radd__ = __add__
def __mul__( self, other ):
return self.to_number() * other
__rmul__ = __mul__
# etc - implement all the others in the same fashion
然后你可以这样做:
class TAG_Short(NBTTag,AbstractNumberImpersonator):
def __init__(self, value=None):
self.name = None
self.value = value
def __repr__(self):
return "TAG_Short: %i" % self.value
def to_number(self):
return self.value
答案 2 :(得分:1)
http://docs.python.org/reference/datamodel.html#emulating-numeric-types
__add__
,__div__
和__sub__
应该让您入门
答案 3 :(得分:1)
是。重载添加方法并使其行为正常。