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

2024-09-27 21:30:46 发布

您现在位置: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,我可以利用它,而不必在需要时创建自己的习惯用法或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'})这样的构造的一个问题是我不能声明它,或者在类型安全方面得到太多。。。你知道吗


Tags: self程序类型标准模式特性mixinclass
1条回答
网友
1楼 · 发布于 2024-09-27 21:30:46

这有点像用推土机敲钉子…但是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__!你知道吗

相关问题 更多 >

    热门问题