有没有办法让课程评估为数字?

时间:2010-08-08 05:42:49

标签: python class

我有一个像这样的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

我需要在标签中添加任何方法以允许我将其用作有效的数字类型吗?

4 个答案:

答案 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)

是。重载添加方法并使其行为正常。