为什么 hasattr 返回错误的结果?

下面是我的测试代码:


import functools



class LazyLoader(object):


    def __init__(self, klass, *args, **kwargs):

        self.klass = klass

        self.args = args

        self.kwargs = kwargs

        self.instance = None


    def __getattr__(self, name):

        return functools.partial(self.__run_method, name)


    def __run_method(self, __name, *args, **kwargs):

        if self.instance is None:

            self.instance = self.klass(*self.args, **self.kwargs)

        return getattr(self.instance, __name)(*args, **kwargs)



class SchedulerReportClient(object):

    def method(self):

        print 'method called'


    def __getattr__(self, name):

        print '__getattr__ called'

        return functools.partial(self.__run_method, name)


    def __run_method(self, __name, *args, **kwargs):

        print '__run_method called'

        return getattr(self, __name)(*args, **kwargs)



if __name__ == "__main__":

    a = SchedulerReportClient()

    entity = LazyLoader(a)


    print hasattr(entity, 'obj_to_primitive')

    print(callable(entity.obj_to_primitive))

    print entity.__class__.__name__

    if hasattr(entity, 'obj_to_primitive') and callable(entity.obj_to_primitive):

        entity.obj_to_primitive()

出局是:


True

True

Traceback (most recent call last):

LazyLoader

  File "C:/Users/chen/PycharmProjects/pytest/main", line 42, in <module>

    entity.obj_to_primitive()

  File "C:/Users/chen/PycharmProjects/pytest/main", line 17, in __run_method

    self.instance = self.klass(*self.args, **self.kwargs)

TypeError: 'SchedulerReportClient' object is not callable

代码大部分在openstack nova中,我复制了一些。


obj_to_primitiveclass 中没有方法SchedulerReportClient,为什么 hasattr 和 callable 函数返回 true?


CentOS7.4 与 Python2.7。


红糖糍粑
浏览 131回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python