在Python中,当我在hasattr
装饰器上调用@property
时,hasattr
函数实际上运行@property
代码块。
例如。一类:
class GooglePlusUser(object):
def __init__(self, master):
self.master = master
def get_user_id(self):
return self.master.google_plus_service.people().get(userId='me').execute()['id']
@property
def profile(self):
# this runs with hasattr
return self.master.google_plus_service.people().get(userId='me').execute()
运行以下代码将调用profile属性,并实际进行调用:
#Check if the call is an attribute
if not hasattr(google_plus_user, call):
self.response.out.write('Unknown call')
return
为什么?如何在不进行api调用的情况下解决此问题?
最佳答案
hasattr()
通过实际获取属性来工作;如果抛出异常,则hasattr()
返回False
。那是因为那是知道属性是否存在的唯一可靠方法,因为存在许多在Python对象(__getattr__
,__getattribute__
,property
对象,元类等)上注入(inject)属性的动态方法。
从 hasattr()
documentation:
如果您不希望在执行此操作时调用属性,则不要使用hasattr
。使用vars()
(返回实例字典)或dir()
(也为您提供类的名称列表)。