当我需要一个快速的一次性类时,我发现自己经常用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.
当然,这不能很好地扩展,添加方法是疯狂的,但即使如此,我也有足够的数据,只丢弃类,我一直在使用它。
这就是我想的namedtuple会是什么样子。但是namedtuple的语法很大,很难处理。
在标准库中有什么东西我还没有找到,它能做得更好吗?
这种款式不好吗?或者它有什么隐藏的缺陷?
两个具体的例子来说明为什么我不使用dict,这两个例子都可以用dict完成,但显然不是惯用的。
#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
从Python 3.3及以后的版本中,您可以使用types.SimpleNamespace:
内置类型大致相当于以下代码:
更新
从Python3.7开始,您可以使用数据类模块:
您可以如下使用:
默认情况下,它包含相等测试和一个漂亮的报表:
这有一个python方法(它只是更新实例的dict而不是调用setattr) Recipe 52308
这是我解决这个问题的办法。优美的语法,不可更改(至少不需要借助于某个讨厌的对象。setattr)体操,轻巧且可打印。尽管这件事你做不到,但你也不能用一个口述词
与…有很好的对称性
总的来说
相关问题 更多 >
编程相关推荐