Я 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
Ничего себе, это, безусловно, лучшее решение, так как у меня есть несколько тегов, к которым это нужно применить. – Thomas