在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()(也为您提供类的名称列表)。

10-06 08:07