类切换 与 __init__参数自动初始化实例变量

《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.buff

if __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模块。

你可能感兴趣的:(python,类切换,参数自动初始化实例变量)