我正在阅读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
我不理解以下内容 - 有人可以帮我这样做吗?:
name, value = kwargs.popitem( )
__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
答案 0 :(得分:4)
kwargs.popitem()
method从kwargs
字典中删除一个(任意)项,并将其作为(key, value)
元组返回。然后将其分配给两个变量name
和value
。
在这种情况下,它表示该类采用一个关键字参数(k
,f
,c
或r
之一)并且如果在查看传入的关键字参数的一个之后,您指定了多个投诉(抛出TypeError
)。
__getattr__
和__setattr__
是looking up attributes时python使用的特殊方法。
t.c
转换为t.__getattr__('c')
,t.c = 23
转换为t.__setattr__('c', 23)
。
因此,将t.c
,t.f
或t.r
中的一个设置为整数将路由到__setattr__
方法,然后self.coefficients
方法使用self.k
映射相反,计算并设置t.c
。
查找t.f
,t.r
或__getattr__
中的一个会被路由到self.coefficients
方法,该方法会根据self.k
映射返回一个值使用现有值{{1}}为您提供所需比例的温度。