当我需要一个快速的一次性类时,我发现自己经常在我的 python 代码中编写这个类。
class Struct(object):
def __init__( self, **kwargs ):
for k in kwargs:
setattr(self,k,kwargs[k])
基本想法是这样我可以快速做这样的事情:
foo = Struct( bar='one', baz=1 )
print foo.bar
foo.baz += 1
foo.novo = 42 # I don't do this as often.
当然,这不能很好地扩展,并且添加方法简直是疯狂的,但即便如此,我仍然有足够的仅数据一次性类,我继续使用它。
这就是我的想法命名元组 http://docs.python.org/library/collections.html#collections.namedtuple将会是。但namedtuple 的语法庞大且笨拙。
标准库中是否有我还没有找到的东西可以做到这一点或更好?
这是不好的风格吗?或者它有一些隐藏的缺陷吗?
update
两个具体的例子来说明为什么我不只使用字典。这两个例子could可以用字典来完成,但它显然不惯用。
#I know an order preserving dict would be better but they don't exist in 2.6.
closure = Struct(count=0)
def mk_Foo( name, path ):
closure.count += 1
return (name, Foo( name, path, closure.count ))
d = dict([
mk_Foo( 'a', 'abc' ),
mk_Foo( 'b', 'def' ),
# 20 or so more
] )
@contextmanager
def deleter( path ):
control = Struct(delete=True,path=path)
try:
yield control
finally:
if control.delete:
shutil.rmtree(path)
with deleter( tempfile.mkdtemp() ) as tmp:
# do stuff with tmp.path
# most contexts don't modify the delete member
# but occasionally it's needed
if keep_tmp_dir:
tmp.delete = False