[英]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.