2012-10-06 7 views
6

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' 

Antwort

6

Sie benötigen die __radd__ magische Methode zu definieren (“ rechts hinzufügen "), um das Verhalten zu steuern, wenn sich der benutzerdefinierte Typ auf der rechten Seite eines Zusatzes befindet. Sie müssen das gleiche für __rmul__, __rsub__, usw. tun, um rechte Versionen aller Operationen zu geben.

1

die magnitude package verwenden, können Sie Einheitenkonvertierung wie folgt behandeln:

import magnitude 
mg = magnitude.mg 
new_mag = magnitude.new_mag 

s = mg(500, 'mm') # s is 500mm 

# Define a pixel unit; 300 px = 500 mm 
new_mag('px', mg(500.0/300.0, 'mm')) 

p = mg(1, 'px')  # p is 1 px 

print('500mm + 1px = {u}'.format(u = (s + p).ounit('px'))) 
# 500mm + 1px = 301.0000 px 
print('500mm + 1px = {u}'.format(u = (s + p).ounit('mm')))  
# 500mm + 1px = 501.6667 mm 
Verwandte Themen