我有一些资源类别:
class Tokens():
def __init__(self, a, b):
self.a = a
self.b = b
def create(self):
return "Tokens resource"
class Users():
def __init__(self, a, b):
self.a = a
self.b = b
def create(self):
return "Users resource"
我有一个客户端类:
class Client():
def __init__(self, account, password):
self.account = account
self.password = password
def __getattr__(self, attr):
self.__dict__[attr] = globals()[str.capitalize(attr)]("a", "b")
使用此类我想创建一个具有延迟加载属性的客户端对象。不幸的是,我第一次得到了例外。但第二次一切都还可以:
>>> client = Client("account", "password")
>>> print client.tokens.create()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'create'
>>> print client.tokens.create()
Tokens resource
我做错了什么?
答案 0 :(得分:2)
您永远不会返回创建的属性:
def __getattr__(self, attr):
self.__dict__[attr] = globals()[str.capitalize(attr)]("a", "b")
return self.__dict__[attr]
您确实在self.__dict__
中设置了属性,因此下次尝试访问该属性会找到该属性,而不会再次调用__getattr__
。
我不确定为什么在str.capitalize()
直接在attr
上调用它时,您使用def __getattr__(self, attr):
self.__dict__[attr] = globals()[attr.capitalize()]("a", "b")
return self.__dict__[attr]
作为非展开方法:
{{1}}