簡體   English   中英

在python中覆蓋{}

[英]Overwrite {} in python

我想創建一個dict int,你可以這樣訪問:

>>> my_dict["property'] = 3
>>> my_dict.property
3

所以我做了這個:

class DictAsMember(dict):
    def __getattr__(self, name):
        return self[name]

這工作正常,但如果你有嵌套dicts它不起作用,例如:

my_dict = DictAsMember()
my_dict["property"] = {'sub': 1}

我可以訪問my_dict.property,但邏輯上我不能做my_dict.property.sub因為屬性是一個默認的dict,所以我想要做的就是覆蓋默認的dict,所以你可以使用{}。

這可能嗎?

該問題的一個解決方法是使用DictAsMember包裝默認詞典,然后在__getattr__方法中返回它們:

class DictAsMember(dict):
    def __getattr__(self, name):
        value = self[name]
        if isinstance(value, dict):
            value = DictAsMember(value)
        elif isinstance(value, list):
            value = [DictAsMember(element)
                     if isinstance(element, dict)
                     else element
                     for element in value]

        return value

my_dict = DictAsMember()
my_dict["property"] = {'sub': 1}
print my_dict.property.sub    # 1 will be printed

my_dict = DictAsMember()
my_dict["property"] = [{'name': 1}, {'name': 2}]
print my_dict.property[1].name    # 2 will be printed

您可以改為使用命名元組,而不是編寫自己的類來實現my_dict.property表示法(這稱為對象表示法)。 可以使用變量引用等對象或標准元組語法來引用命名元組。 文檔中

[named tuple]用於創建類似元組的對象,這些對象具有可通過屬性查找訪問的字段以及可索引和可​​迭代的字段。

作為他們使用的一個例子:

from collections import *

my_structure = namedtuple('my_structure', ['name', 'property'])
my_property  = namedtuple('my_property', ['sub'])

s = my_structure('fred', my_property(1))

s # my_structure(name='fred', property=my_property(sub=1)) will be printed

s.name # 'fred' will be printed

s.property # my_property(sub=1) will be printed

s.property.sub # 1 will be printed

有關命名元組的精彩摘要,另請參閱此問題的已接受答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM