我有一个用例,我想在字典中存储一个键值对。 我面临的问题是我的钥匙是“复制”。因此,在插入“ 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
有没有办法解决此问题?
答案 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