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

 

posted on 2013-11-06 22:58  七海之风  阅读(249)  评论(0)    收藏  举报

导航