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