Ich brauche eine Klasse, die eine ganze Zahl ist, deren Wert geändert werden kann, nachdem das Objekt erstellt wurde. Ich brauche diese Klasse, um eine Größe zu definieren, die zuerst in Millimetern angegeben wird. Später, wenn die Benutzeroberfläche erstellt wird, bekomme ich einen Faktor aus dem Gerätekontext, der Millimeter in Pixel umrechnet. Dieser Faktor sollte den Millimeter-Wert meines Objekts in einen Pixelwert ändern.Integer-Objekt, dessen Wert nach der Definition geändert werden kann?
Ich habe versucht, Unterklasse int (siehe increment int object), aber int ist unveränderlich, so kann ich seinen Wert nicht ändern.
class UiSize(int):
def __new__(cls, value=0):
i = int.__new__(cls, value)
i._orig_value = value
return i
def set_px_per_mm(self, px_per_mm):
pixel_value = int(round(self._orig_value * px_per_mm))
print "pixel_value", pixel_value
# how to set the new pixel_value to the object's value ?
s = UiSize(500)
s.set_px_per_mm(300.0/500.0)
print "1px + 500mm =", 1 + s, "px" # the result should be 301 pixels
Die Antwort in increment int object war meine eigene Klasse mit all den Methoden des int zu bauen. Also habe ich versucht, dies:
class UiSize2(object):
def __init__(self, value=0):
self._int_value = int(value)
def __add__(self, other):
return self._int_value.__add__(other)
def set_px_per_mm(self, px_per_mm):
self._int_value = int(round(self._int_value * px_per_mm))
s = UiSize2(500)
s.set_px_per_mm(300.0/500.0)
print "500mm + 1 =", s + 1, "px"
ich für funktioniert 's + 1', aber für '1 + s' Ich erhalte eine Typeerror:
>>> print "1 + 500mm =", 1 + s, "px"
TypeError: unsupported operand type(s) for +: 'int' and 'UiSize2'