有没有办法可以在python中创建没有复制方法的自定义词典?

时间:2019-06-26 10:02:55

标签: python

我有一个用例,我想在字典中存储一个键值对。 我面临的问题是我的钥匙是“复制”。因此,在插入“ copy”键之后,我无法通过getattr方法访问它,因为它总是返回dict的copy方法。

我无法对dict使用get方法,因为我的代码不知道所传递的对象的类型。因此,我继续使用getattr这个通用函数来访问属性。

我还创建了一个自dict继承的自定义类,并编写了 getattribute ,但这会阻止对方法的访问


class DictLike(dict):
    def __getattribute__(self, k):
        try:
            return self[k]
        except KeyError:
            getattr(super(DictLike, self), k)

    def paste(self):
        return "Test"



a = DictLike()
a['copy'] = 1;
a['state'] = 'completed'

print(getattr(a, 'copy')) // prints 1
print(a.paste()) // this does not works

b = {'copy': 1}

print(b.get('copy')) \\ 1
getattr(b, 'copy') \\ function


有没有办法解决此问题?

4 个答案:

答案 0 :(得分:3)

这是可行的解决方案:

class DictLike(dict):

    def __init__(self, *args, **kw):
        super(DictLike, self).__init__(*args, **kw)
        self.itemlist = super(DictLike, self).keys()

    def __getattribute__(self, k):
        try:
            return self[k]
        except Exception as e:
            return super().__getattribute__ (k)

    def paste(self):
        return "Test"


a = DictLike()
a['copy'] = 1
a['state'] = 'completed'

print(getattr(a, 'copy'))
print(a.paste())

答案 1 :(得分:0)

如果您定义__getattr__而不是__getattribute__,这似乎是可行的。

答案 2 :(得分:0)

是的,您将无法使用getattr来获取名为“ copy”的密钥。就像您可能知道的那样,如果命名空间冲突,Python PEP标准建议更改关键字的名称。但是,您的不是关键字,我仍然会遵循此标准。当前标准的后跟下划线,例如“ copy_”。在PEP8标准中声明为here:“ single_trailing_underscore_:按惯例用于避免与Python关键字冲突。”

我对dictVar.get()的含义感到困惑,因为它不知道类型,所以无法访问您的密钥。您还要传递什么其他类型。它对某些字符串或整数有效。

答案 3 :(得分:-1)

您应该使用 getattr ,这是一个很好的解释-Difference between __getattr__ vs __getattribute__

因此,它工作得很好:

class DictLike(dict):                                                                                                      
    def __getattr__(self, k):                                                                                              
        try:                                                                                                               
            return self[k]                                                                                                 
        except KeyError:                                                                                                   
            getattr(super(DictLike, self), k)                                                                              

    def paste(self):                                                                                                       
        return "Test"                                                                                                      


a = DictLike()                                                                                                             
a['copy'] = 1;                                                                                                             
a['state'] = 'completed'                                                                                                   

print(a['copy'])                                                                                                           
print(a.paste())  

输出为:

1
Test