Python.use(better) #Calculator: step01b -- class Calculator

記事一覧 Python.use(better)《Python3.1》《復刻版》

class Calculator

《著》森こねこ、小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
第0版♪2001/03/02 ● 第1版♪2003/05/25 ● 第2版♪2004/06/01 ● 第3版♪2009/02/28

課題を作成する過程を通して「プログラミング」の理解を深めます。
Smalltalk-80 で作成した例題を、Python3.1 で再構成しました。

  • Smalltalk a la carte #02, 電卓(デスクトップ), 1988, 1992, 1995.


《移動中です》

class Calculator:
    def __init__(self):
        self.op  = ""
        self.acc = 0
        self.reset()

    def __repr__(self):
        return "%s %s"%(
            self.__class__.__name__,
            vars(self),
            )

    def __str__(self):
        return "".join(self.reg)

    ## ----------------------------------------
    def _changed(self):
        self._update()
        
    def _update(self):
        print(str(self))

    ## ----------------------------------------
    def reset(self):
        self.reg = []

    def append(self, value):
        self.reg.append(value)
        self._changed()

    def eval(self):
        return eval(str(self))

    def __call__(self, key):
        op  = self.op
        op1 = self.acc
        op2 = self.eval()

        value = eval("%s %s %s"%(op1, op, op2)) if op else op2

        self.op  = key
        self.acc = value
        self.reset()
        return value

## ----------------------------------------
class Key:
    def __init__(self, calculator, value):
        self.calculator = calculator
        self.value = value

    def __repr__(self):
        return "%s(%r)"%(
            self.__class__.__name__,
            self.value,
            )

class NumKey(Key):
    def __call__(self):
        self.calculator.append(self.value)

class OpKey(Key):
    def __call__(self):
        return self.calculator(self.value)

TOP


関連記事

Last updated♪2010/02/01