繁体   English   中英

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

[英]Standard Python base class as a container for arbitrary attributes

只是问这个问题,是因为它似乎是经常出现的模式,我想知道是否有人知道支持此功能的标准库功能,或者说单行的功能可能等效。

如果我想定义一个用于传递数据的类,该类可以包含任意属性,可以在构造时进行设置,如下所示:

>>> 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

有些人可能会很快跳进去说“使用字典”,但是我在考虑一些用例,其中可能希望模拟现有的对象类型(鸭子类型)并推断出它是特定的“类型” (例如,如果此功能仅用作混入)。

编辑:类似地,诸如s = type('Splat', (), {'attr2': 'gurt', 'attr3': 'sint', 'attr1': 'burp'})是我没有声明它,或者在类型安全方面有很多...

这有点像用推土机argparse钉子...但是argparse定义了一个做到这一点的Namespace类:

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

您总是可以从中得出:

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

但是,我真的不建议您这样做,因为这有点...很棘手...

至少您免费获得__str____repr__

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM