Python實(shí)現(xiàn)字典的點(diǎn)號(hào)取值的三種常用方式
在 Python 中實(shí)現(xiàn)字典的點(diǎn)號(hào)取值(dict.key 語(yǔ)法)可以通過(guò)自定義類實(shí)現(xiàn)。以下是三種常用實(shí)現(xiàn)方式,根據(jù)需求選擇合適方案:
方案1:簡(jiǎn)單屬性訪問(wèn)(推薦)
class DotDict(dict):
"""支持點(diǎn)號(hào)取值的字典類"""
__getattr__ = dict.get
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
# 使用示例
d = DotDict({"name": "Alice", "age": 30, "address": {"city": "Shanghai"}})
print(d.name) # 輸出: Alice
print(d.address.city) # 輸出: Shanghai
d.job = "Engineer" # 添加新屬性
print(d.job) # 輸出: Engineer
方案2:遞歸嵌套轉(zhuǎn)換(支持多層嵌套)
class DotDict(dict):
"""支持嵌套字典的點(diǎn)號(hào)訪問(wèn)"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for key, value in self.items():
if isinstance(value, dict):
self[key] = DotDict(value)
def __getattr__(self, name):
try:
value = self[name]
if isinstance(value, dict) and not isinstance(value, DotDict):
return DotDict(value)
return value
except KeyError:
raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
__setattr__ = dict.__setitem__
__delattr__ = dict.__delitem__
# 使用示例
data = {
"user": {
"name": "Bob",
"preferences": {
"theme": "dark",
"notifications": True
}
}
}
d = DotDict(data)
print(d.user.name) # 輸出: Bob
print(d.user.preferences.theme) # 輸出: dark
d.user.preferences.font_size = 14 # 添加嵌套屬性
方案3:只讀訪問(wèn)(安全模式)
class ReadOnlyDotDict(dict):
"""只讀的點(diǎn)號(hào)訪問(wèn)字典"""
def __getattr__(self, name):
if name in self:
value = self[name]
if isinstance(value, dict):
return ReadOnlyDotDict(value)
return value
raise AttributeError(f"No attribute '{name}'")
def __setattr__(self, name, value):
raise TypeError("'ReadOnlyDotDict' object is read-only")
# 使用示例
config = ReadOnlyDotDict({"api": {"url": " "timeout": 30}})
print(config.api.url) # 輸出:
config.api.port = 8080 # 拋出 TypeError
關(guān)鍵特性對(duì)比
| 特性 | 方案1 | 方案2 | 方案3 |
|---|---|---|---|
| 點(diǎn)號(hào)取值 | ? | ? | ? |
| 嵌套字典支持 | ? | ? | ? |
| 動(dòng)態(tài)添加屬性 | ? | ? | ? |
| 修改現(xiàn)有值 | ? | ? | ? |
| 錯(cuò)誤處理 | 簡(jiǎn)單 | 完善 | 嚴(yán)格 |
| 適用場(chǎng)景 | 簡(jiǎn)單配置 | 復(fù)雜數(shù)據(jù)結(jié)構(gòu) | 只讀配置 |
使用建議
- 簡(jiǎn)單配置:選擇方案1,代碼簡(jiǎn)潔高效
- 復(fù)雜JSON/嵌套數(shù)據(jù):選擇方案2,自動(dòng)轉(zhuǎn)換嵌套字典
- 安全配置/常量:選擇方案3,防止意外修改
- 兼容性:所有方案保持字典原始方法(
keys(),values()等) - 錯(cuò)誤處理:方案2/3提供明確的
AttributeError錯(cuò)誤信息
# 實(shí)際應(yīng)用示例 - 加載配置文件
import json
from dot_dict import DotDict # 假設(shè)保存為 dot_dict.py
with open('config.json') as f:
config = DotDict(json.load(f))
# 點(diǎn)號(hào)訪問(wèn)配置項(xiàng)
print(f"API端點(diǎn): {config.api.base_url}")
print(f"超時(shí)設(shè)置: {config.api.timeout}s")
到此這篇關(guān)于Python實(shí)現(xiàn)字典的點(diǎn)號(hào)取值的三種常用方式的文章就介紹到這了,更多相關(guān)Python字典的點(diǎn)號(hào)取值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python urllib urlopen()對(duì)象方法/代理的補(bǔ)充說(shuō)明
這篇文章主要介紹了python urllib urlopen()對(duì)象方法/代理的補(bǔ)充說(shuō)明的相關(guān)資料,需要的朋友可以參考下2017-06-06
Python文件讀寫操作基礎(chǔ)知識(shí)和實(shí)戰(zhàn)應(yīng)用
本文系統(tǒng)講解了Python文件操作的基礎(chǔ)知識(shí)和實(shí)戰(zhàn)技巧,涵蓋文件打開關(guān)閉、讀寫方法、指針控制、二進(jìn)制處理、異常處理及性能優(yōu)化策略,同時(shí)展望了異步IO、內(nèi)存映射增強(qiáng)等未來(lái)趨勢(shì),需要的朋友可以參考下2025-06-06
pycharm終端安裝pytorch失敗的問(wèn)題及解決
這篇文章主要介紹了pycharm終端安裝pytorch失敗的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Python基于文本內(nèi)容實(shí)現(xiàn)隱私信息提取與評(píng)估
這篇文章主要為大家介紹了Python如何實(shí)現(xiàn)基于文本內(nèi)容的用戶隱私泄露風(fēng)險(xiǎn)評(píng)估系統(tǒng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下2025-03-03
如何使用Python在excel中創(chuàng)建柱狀圖
這篇文章主要給大家介紹了關(guān)于如何使用Python在excel中創(chuàng)建柱狀圖的相關(guān)資料,包括導(dǎo)入模塊、新建工作簿、創(chuàng)建圖表、設(shè)置數(shù)據(jù)范圍、添加標(biāo)題和數(shù)據(jù)系列、以及保存圖表和工作簿,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
python 獲取當(dāng)前目錄下的文件目錄和文件名實(shí)例代碼詳解
這篇文章主要介紹了python 獲取當(dāng)前目錄下的文件目錄和文件名實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

