gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:22:31 24 4
gpt4 key购买 nike

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

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

>>> 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 或其中的某些内容,如果没记错的话),我想它通常会足够有用,< em>可能是一种常用的 python 惯用语或 mixin,我可以利用它,而不必在需要时创建自己的惯用语或 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'}) 是我无法声明它,或者对类型安全有很大影响......

最佳答案

这有点像用推土机敲钉子......但是 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__!

关于python - 标准 Python 基类作为任意属性的容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32994545/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com