下面是我的测试代码:
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。
相关分类