2010-08-08 2 views
0

у меня есть класс питона так:Есть ли способ оценить класс как число?

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 

есть ли способ Мне нужно добавить в тег, чтобы я мог использовать его как действительный числовой тип?

ответ

3

Я see--, что вы хотели, чтобы иметь что-то вроде метода __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 
+0

Ничего себе, это, безусловно, лучшее решение, так как у меня есть несколько тегов, к которым это нужно применить. – Thomas

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 для получения дополнительной информации

+0

Do ** not ** забудьте сделать это: '__radd__ = __add__' и т. Д. – jcao219

+0

Спасибо человеку, я надеялся, что есть более простой способ (например, использовать __repr__ для автоматического преобразования строк), но это тоже работает. – Thomas

1

Да. Перегрузите , добавьте метод и сделайте так, чтобы он работал соответствующим образом.

Смежные вопросы