python 类似 dict

本文介绍了一个名为Storage的类,它提供了一种类似于字典的对象,允许通过键名和键路径来访问和设置属性,同时支持键的动态添加、删除和属性访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

工作中的代码,功能不错。


class Storage(dict):

    """
    A Storage object is like a dictionary except `obj.foo` can be used
    in addition to `obj['foo']`.
    
        >>> o = storage(a=1)
        >>> o.a
        1
        >>> o['a']
        1
        >>> o.a = 2
        >>> o['a']
        2
        >>> del o.a
        >>> o.a
        Traceback (most recent call last):
            ...
        AttributeError: 'a'
    
    """
    def __getattr__(self, key): 
        try:
            return self[key]
        except KeyError, k:
            raise AttributeError, k
    
    def __setattr__(self, key, value): 
        self[key] = value
    
    def __delattr__(self, key):
        try:
            del self[key]
        except KeyError, k:
            raise AttributeError, k
    
    def __repr__(self):     
        return '<Storage ' + dict.__repr__(self) + '>'
在 C 语言中,可以使用结构体和指针实现类似 Python 的字典(dict)。 具体实现方式为,定义一个结构体作为字典中的元素,该结构体包含两个成员,一个是 key,另一个是 value。同时定义一个指向该结构体的指针数组,用于存储所有元素。 当需要往字典中添加一个元素时,可以先判断该元素的 key 是否已经存在于字典中,如果不存在,则动态分配内存给该元素,并将其添加到指针数组中;如果存在,则更新该元素的 value。 当需要从字典中删除一个元素时,可以根据 key 查找该元素的位置,并将其从指针数组中删除,并释放内存。 当需要访问字典中的某个元素时,可以根据 key 查找该元素,并返回其 value。 以下是一份简单的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 定义字典元素的结构体 typedef struct { char *key; int value; } DictEntry; // 定义字典的结构体 typedef struct { int size; DictEntry **entries; } Dict; // 创建一个新的字典 Dict *dict_new() { Dict *dict = (Dict *)malloc(sizeof(Dict)); dict->size = 0; dict->entries = NULL; return dict; } // 销毁一个字典 void dict_free(Dict *dict) { if (dict == NULL) { return; } for (int i = 0; i < dict->size; i++) { DictEntry *entry = dict->entries[i]; free(entry->key); free(entry); } free(dict->entries); free(dict); } // 根据 key 查找字典中的元素 DictEntry *dict_find(Dict *dict, char *key) { for (int i = 0; i < dict->size; i++) { DictEntry *entry = dict->entries[i]; if (strcmp(entry->key, key) == 0) { return entry; } } return NULL; } // 向字典中添加或更新一个元素 void dict_set(Dict *dict, char *key, int value) { DictEntry *entry = dict_find(dict, key); if (entry == NULL) { // 元素不存在,需要动态分配内存 entry = (DictEntry *)malloc(sizeof(DictEntry)); entry->key = strdup(key); entry->value = value; // 将元素添加到指针数组中 dict->size++; dict->entries = (DictEntry **)realloc(dict->entries, dict->size * sizeof(DictEntry *)); dict->entries[dict->size - 1] = entry; } else { // 元素已经存在,直接更新其 value entry->value = value; } } // 从字典中删除一个元素 void dict_delete(Dict *dict, char *key) { DictEntry *entry = dict_find(dict, key); if (entry != NULL) { // 将元素从指针数组中删除 for (int i = 0; i < dict->size; i++) { if (dict->entries[i] == entry) { for (int j = i; j < dict->size - 1; j++) { dict->entries[j] = dict->entries[j + 1]; } dict->size--; break; } } // 释放内存 free(entry->key); free(entry); } } // 根据 key 访问字典中的某个元素 int dict_get(Dict *dict, char *key) { DictEntry *entry = dict_find(dict, key); if (entry != NULL) { return entry->value; } else { return -1; // 表示未找到 } } int main() { // 创建一个新的字典 Dict *dict = dict_new(); // 往字典中添加几个元素 dict_set(dict, "foo", 42); dict_set(dict, "bar", 69); // 访问字典中的某个元素 printf("%d\n", dict_get(dict, "foo")); // 删除字典中的某个元素 dict_delete(dict, "foo"); // 销毁字典 dict_free(dict); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值