标准Python基类作为任意属性的容器

时间:2015-10-07 14:10:29

标签: python

只是问这个问题,因为它似乎是一个非常规律​​地出现的模式,我想知道是否有人知道支持这个的标准库功能,或者是一个可能做同等事情的单行。

如果我想定义一个传递数据的类,它可以包含任意属性,在构造时可以设置我可以这样做:

>>> 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,我可以利用它,而不必在我需要时创建自己的。

我知道在我需要时只包含四个衬垫,但为了简约,我想知道是否有0或至少1个衬垫的变体我可以使用。像这样可能:

s = TheBaseClass({'attr2': 'gurt', 'attr3': 'sint', 'attr1': 'burp'})

class Splat(TheBaseClass):
    pass

有些人可能会很快跳入并说“使用字典”,但我想的是用户可能希望模拟现有的对象类型(鸭子类型),并推断它是特定的“type”(如果此功能仅用作mixin)。

编辑类似地,s = type('Splat', (), {'attr2': 'gurt', 'attr3': 'sint', 'attr1': 'burp'})等结构的问题在于我无法声明它,或者在类型安全方面受到很大影响...... < / p>

1 个答案:

答案 0 :(得分:1)

这有点像用推土机击打钉子......但是argparse定义了一个Namespace类来执行此操作:

import argparse
print(argparse.Namespace(a=1, b=2))

你总是可以从中得到:

import argparse
class X(argparse.Namespace): pass
print(X(a=1, b=2))

但是,我不建议你这样做,因为它有点...... icky ......

至少你可以免费获得__str____repr__