《python Cook Book》chapter 6 notes.
一、缓存环的实现
该节中讲述了类切换技术和方法切换技术。当需要成组地切换所有的方法时,类切换方法可能是最佳的,而方法切换则在需要更细的行为粒度控制的时候更加合适。
class RingBuff(object): def __init__(self, maxsize): self.maxsize = maxsize self.buff = [] class __Full(object): def append(self, x): self.buff[self.cur] = x self.cur = (self.cur + 1) % self.maxsize def tolist(self): # return with right order return self.buff[self.cur:] + self.buff[:self.cur] def append(self, data): self.buff.append(data) if (len(self.buff) == self.maxsize): self.cur = 0 self.__class__ = self.__Full # change class def tolist(self): return self.buffif __name__ == '__main__': buff = RingBuff(5) for x in xrange(4): buff.append(x) print buff.tolist() buff.append(4) buff.append(5) print buff.tolist(
二、__init__参数自动初始化实例变量
def attributesFromDict(d): self = d.pop('self') for name, value in d.iteritems(): setattr(self, name, value)class Myclass(object): def __init__(self, name, age, weight): attributesFromDict(locals())if __name__ == '__main__': student = Myclass('asdf', 23, 64) print student.name, student.age, student.避免在__init__中对每个变量一一写赋值语句。此方法的局限性:attributesFromDict无法区分字典里的传递给__init__的参数__init__内部的局部变量。最好的方法是用标准库inspect模块。