2012年6月24日日曜日

動的に属性を変更可能なクラス

namedtupleはとても便利だが、値の変更ができない。
値の変更可能な、エセnamedtuple を作ってみました。
namedtuple にはあってこれにはない属性がいろいろあるけど、そこは追々作るということで。

def Dynamic(name, fields):
    """ returns a class object which has fields attribute.
    the class is iterable."""
    dic = dict([x,None] for x in fields)
    o = type(name, (_dynamic,), dic)
    o._fields = fields
    return o
class _dynamic(object):
    _fields = []

    def __init__(self, *args, **kwargs):
        for i,value in enumerate(args[0]):
            setattr(self, self._fields[i], value)

    def __iter__(self):
        for field in self._fields:
            yield getattr(self, field)

    def __setattr__(self, name, value):
        if name == "_fields":
            for field in self._fields:
                delattr(self, field)
            for field in value:
                super(_dynamic, self).__setattr__(field, None)
        super(_dynamic, self).__setattr__(name, value)

0 件のコメント: