Python Cookbook学习记录 ch6_1_2013/11/6
6.1 温标的转换
在开式温度,摄氏度,华氏温度及兰金温度之间做转换
将功能封装在如下的类中:
# -*- coding: cp936 -*- class Temperature(object): coefficients = {'c':(1.0,0.0,-273.15),'f':(1.8,-273.15,32),'r':(1.8,0.0,0.0)} def __init__ (self,**kwargs): try: name,value = kwargs.popitem() except KeyError: name,value = 'k',0 if kwargs or name not in 'kcfr': kwargs[name] = value raise TypeError, 'invalid arguments %r' %kwargs setattr(self,name,float(value)) #same as self.name = float(value) def __getattr__(self,name): #将c,f,r的获取映射到k的计算 try: eq = self.coefficients[name] except: #未知名字,提示错误 raise AttributeError,name return (self.k +eq[1])*eq[0]+eq[2] def __setattr__(self,name,value): #将对k,c,f,r的设置映射到对k的设置;并禁止其他的选项 if name in self.coefficients: eq = self.coefficients[name] self.k = (value-eq[2])/eq[0] - eq[1] elif name == 'k': object.__setattr__(self,name,value) else: #未知名,给出错误信息 raise ArithmeticError,name def __str__(self): #以易读和简洁的格式打印 return "%s K" %self.k def __repr__(self): #以详细和准确的格式打印 return "Temperature(K=%r)" %self.k
这个类中共涉及__getattr__,__setattr__这两个特殊方法,__getattr__和__setattr__可以用来对属性的设置和取值进行处理。
在给Book对象赋属性时(如name,value)时会调用__satattr__这个方法,必须通过object.__setattr__来完成属性设置,其中当属性名称为"value"时,将值减去了100
通过c.name可以获取属性的值,这时候调用__getattr__方法,注意,这个属性不能是记录在实例中的属性,如果是记录在实例中的属性,那么不会调用__getattr__方法
>>> class Book(object): def __setattr__(self, name, value): if name == 'value': object.__setattr__(self, name, value - 100) else: object.__setattr__(self, name, value) def __getattr__(self, name): try: return object.__getattribute__(name) except: return name + ' is not found!' def __str__(self): return self.name + ' cost : ' + str(self.value) >>> c = Book() >>> c.name = 'Python' >>> c.value = 100 >>> print c.name Python >>> print c.value 0
浙公网安备 33010602011771号