需要从python书中了解这个程序

时间:2013-01-16 08:44:11

标签: python oop

我正在阅读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__做了什么。他没有在程序的最后调用中使用这些
  3. 这是输出:

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

1 个答案:

答案 0 :(得分:4)

  • kwargs.popitem() methodkwargs字典中删除一个(任意)项,并将其作为(key, value)元组返回。然后将其分配给两个变量namevalue

    在这种情况下,它表示该类采用一个关键字参数(kfcr之一)并且如果在查看传入的关键字参数的一个之后,您指定了多个投诉(抛出TypeError)。

  • __getattr____setattr__looking up attributes时python使用的特殊方法。

    t.c转换为t.__getattr__('c')t.c = 23转换为t.__setattr__('c', 23)

    因此,将t.ct.ft.r中的一个设置为整数将路由到__setattr__方法,然后self.coefficients方法使用self.k映射相反,计算并设置t.c

    查找t.ft.r__getattr__中的一个会被路由到self.coefficients方法,该方法会根据self.k映射返回一个值使用现有值{{1}}为您提供所需比例的温度。