【发布时间】:2016-01-04 19:43:07
【问题描述】:
之所以问这个问题,是因为它似乎是一种经常出现的模式,我想知道是否有人知道支持这个的标准库功能,或者可能做类似事情的单线。
如果我想定义一个用于传递数据的类,它可以包含任意属性,在构造时进行设置,我可以这样做:
>>> 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'}) 这样的构造的问题是我无法声明它,或者在类型安全方面获得太多...
【问题讨论】:
-
@jonrsharpe 谢谢,这些链接很有帮助,但并不能真正回答我的问题
-
@Kay 我认为这与我在问题顶部的内容相同,但都是一行:)
-
@johnsharpe 您提供的第一个链接是关于如何实现此模式的“一般建议” - 我正在寻找一个实际的标准实现
-
@johnsharpe 第二个没有提供我要找的构造函数接口
标签: python