オブジェクトの作成後に値を変更できる整数のクラスが必要です。最初にミリメートルで指定されるサイズを定義するには、このクラスが必要です。後でユーザーインターフェイスが作成されるときに、デバイスコンテキストからミリメートルをピクセルに変換する要素を取得します。この係数により、オブジェクトのミリメートル値がピクセル値に変更されます。
intをサブクラス化しようとしましたが(increment intオブジェクトを参照)、intは不変であるため、その値を変更できません。
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
インクリメントintオブジェクトの答えは、すべてのintのメソッドを使用して独自のクラスを作成することでした。だから私はこれを試しました:
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"
私は「s+1」で動作しますが、「1 + s」ではTypeErrorが発生します:
>>> print "1 + 500mm =", 1 + s, "px"
TypeError: unsupported operand type(s) for +: 'int' and 'UiSize2'