0

私は Python Cookbook を読んでいますが、そこには次のプログラムがあります。

class Temperature(object):
    coefficients = {'c': (1.0, 0.0, -273.15), 'f': (1.8, -273.15, 32.0),
                    'r': (1.8, 0.0, 0.0)}


    def __init__(self, **kwargs):
        # default to absolute (Kelvin) 0, but allow one named argument,
        # with name being k, c, f or r, to use any of the scales
        try:
            name, value = kwargs.popitem( )
        except KeyError:
            # no arguments, so default to k=0
            name, value = 'k', 0
        # error if there are more arguments, or the arg's name is unknown
        if kwargs or name not in 'kcfr':
            kwargs[name] = value             # put it back for diagnosis
            raise TypeError, 'invalid arguments %r' % kwargs
        setattr(self, name, float(value))


    def __getattr__(self, name):
        # maps getting of c, f, r, to computation from k
        try:
            eq = self.coefficients[name]
        except KeyError:
            # unknown name, give error message
            raise AttributeError, name
        return (self.k + eq[1]) * eq[0] + eq[2]


    def __setattr__(self, name, value):
        # maps settings of k, c, f, r, to setting of k; forbids others
        if name in self.coefficients:
            # name is c, f or r -- compute and set k
            eq = self.coefficients[name]
            self.k = (value - eq[2]) / eq[0] - eq[1]
        elif name == 'k':
            # name is k, just set it
            object.__setattr__(self, name, value)
        else:
            # unknown name, give error message
            raise AttributeError, name

    def __str__(self):
        # readable, concise representation as string
        return "%s K" % self.k


    def __repr__(self):
        # detailed, precise representation as string
        return "Temperature(k=%r)" % self.k

次のことが理解できませんでした - 誰かが私を助けてくれませんか?

  1. この機能は何をしますかname, value = kwargs.popitem( )
  2. 何をし__getattr__、何をし__setattr__ますか。彼はプログラムの最終呼び出しでこれらを使用しませんでした

これは出力でした:

>>> from te import Temperature
>>> t = Temperature(f=70)        # 70 F is...
>>> print t.c                    # ...a bit over 21 C
21.1111111111
>>> t.c = 23                     # 23 C is...
>>> print t.f                    # ...a bit over 73 F
73.4
4

1 に答える 1

4
  • このkwargs.popitem()メソッドは、ディクショナリから1 つの(任意の) 項目を削除し、それをタプルとして返します。次に、これを 2 つの変数およびに割り当てます。kwargs(key, value)namevalue

    この場合、クラスが1 つのキーワード引数 ( kfcまたはのいずれか) を取り、複数を指定すると、渡されたキーワード引数の1 つを調べた後にr文句を言う ( をスローする) ことを意味します。TypeError

  • __getattr__とは、属性を__setattr__検索するときに python によって使用される特別なメソッドです。

    t.cに変換しt.__getattr__('c')、 にt.c = 23変換しt.__setattr__('c', 23)ます。

    したがって、 または のいずれかを整数に設定t.cするt.ft.r__setattr__メソッドにルーティングされ、代わりにself.coefficientsマッピングを使用して計算および設定されself.kます。

    またはの 1 つをt.c検索すると、 メソッドにルーティングされ、の既存の値とともにマッピングに基づいて値が返され、要求されたスケールで温度が得られます。t.ft.r__getattr__self.coefficientsself.k

于 2013-01-16T08:46:44.540 に答える