我有一个用例,我正在读取 pickle 文件并将文件内容放入自定义 DictLikeObject 中。
但是,其中一个文件列是“复制”,并且 DictLikeObject 有复制方法,因此我无法获取该列的正确值。
考虑下面的代码:
class DictLikeObject(dict):
def __getattr__(self, key):
try:
return self[key]
except AttributeError:
raise ValueError("Not Found")
def copy(self):
pass
row = DictLikeObject()
row['copy'] = 1;
row['state'] = 'completed'
print(getattr(row, 'state'))
completed
print(getattr(row, 'copy'))
<bound method DictObject.copy of {'copy': 1, 'state': 'completed'}>
有没有办法确保 getattr
返回“copy”属性的值,而不是方法?
最佳答案
为什么不使用 dict.get 来获取属性,这将确保搜索键,而不是类的属性。它还不需要定义自定义 __getattr__
dunder 方法
print(row.get('copy'))
print(row.get('state'))
输出将是
1
completed
尽管如果您想使用 getattr
,您可以覆盖 __getattribute__
相反
class DictLikeObject(dict):
#Overrode getattribute
def __getattribute__(self, key):
try:
return self[key]
except AttributeError:
raise ValueError("Not Found")
def copy(self):
pass
row = DictLikeObject()
row['copy'] = 1
row['state'] = 'completed'
print(getattr(row, 'state'))
print(getattr(row, 'copy'))
输出将是
completed
1
关于python - 如何处理Python dict之类对象中的名称冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56674869/