6

オブジェクトの作成後に値を変更できる整数のクラスが必要です。最初にミリメートルで指定されるサイズを定義するには、このクラスが必要です。後でユーザーインターフェイスが作成されるときに、デバイスコンテキストからミリメートルをピクセルに変換する要素を取得します。この係数により、オブジェクトのミリメートル値がピクセル値に変更されます。

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'
4

2 に答える 2

6

__radd__カスタムタイプが加算の右側にある場合の動作を制御するには、マジックメソッド(「右加算」)を定義する必要があります。すべての操作の右側のバージョンを提供するには、、など__rmul__についても同じことを行う必要があります。__rsub__

于 2012-10-06T20:07:04.370 に答える
1

マグニチュードパッケージを使用すると、次のように単位変換を処理できます。

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
于 2012-10-06T20:17:55.120 に答える