在一个用例中,我正在读取一个pickle文件,并将文件内容放入自定义DictLikeObject中。
但是,文件列之一是'copy'并且DictLikeObject具有copy方法,由于该原因,我无法获取该列的正确值。
考虑以下代码:
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'属性的值而不是方法?
答案 0 :(得分:1)
为什么不使用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
答案 1 :(得分:0)
为此,您应该使用dict.copy
,否则getattr将返回您所看到的copy的类方法。
print(row.get('state'))
print(row.get('copy'))