问这个问题是因为它似乎是一个经常出现的模式,我想知道是否有人知道一个标准库特性支持这个,或者一个行程序可能做了类似的事情。你知道吗
如果我想定义一个类来传递数据,它可以包含任意属性,在构造时设置,我可以这样做:
>>> class Splat:
def __init__(self, **args):
for k, v in args:
setattr(self, k, v)
然后像这样使用:
>>> s = Splat(attr1='burp', attr2='gurt', attr3='sint')
>>> vars(s)
{'attr2': 'gurt', 'attr3': 'sint', 'attr1': 'burp'}
这是我在python标准库(ssl.wrapSocket
中看到的一种模式,如果内存可用的话,也可以是其中的某个模式),我可以想象它在一般情况下非常有用,可以是一种常用的python习惯用法或mixin,我可以利用它,而不必在需要时创建自己的习惯用法或mixin。你知道吗
我知道当我需要的时候,它只是一个四行程序来包含这个,但是为了节约起见,我想知道是否有一个0或至少1行的变体我可以使用。像这样也许:
s = TheBaseClass({'attr2': 'gurt', 'attr3': 'sint', 'attr1': 'burp'})
或者
class Splat(TheBaseClass):
pass
有些人可能会很快跳进去说“使用dict”,但是我正在考虑一些用例,在这些用例中,人们可能希望模拟一个现有的对象类型(duck类型),并推断它是一个特定的“类型”(就像这个特性只是用作mixin一样)。你知道吗
编辑:类似地,像s = type('Splat', (), {'attr2': 'gurt', 'attr3': 'sint', 'attr1': 'burp'})
这样的构造的一个问题是我不能声明它,或者在类型安全方面得到太多。。。你知道吗
这有点像用推土机敲钉子…但是
argparse
定义了一个Namespace
类,它可以执行以下操作:你可以从中得到:
不过,我不建议你这么做,因为这有点…恶心。。。你知道吗
至少你可以免费得到
__str__
和__repr__
!你知道吗相关问题 更多 >
编程相关推荐