Python 如何访问使用uu getattr动态创建的对象的属性__

Python 如何访问使用uu getattr动态创建的对象的属性__,python,python-2.7,attributes,Python,Python 2.7,Attributes,我有一些类别的资源: 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 creat

我有一些类别的资源:

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
>>客户端=客户端(“帐户”、“密码”)
>>>打印client.tokens.create()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“非类型”对象没有属性“创建”
>>>打印client.tokens.create()
代币资源
我做错了什么?

您永远不会返回创建的属性:

def __getattr__(self, attr):
    self.__dict__[attr] = globals()[str.capitalize(attr)]("a", "b")
    return self.__dict__[attr]
您确实在
self.\uuuu dict\uuu
中设置了该属性,因此下次尝试访问该属性时会找到该属性,并且不再调用
\uu getattr\uuuu

我不知道为什么您可以直接在
attr
上调用
str.capitalize()
作为未找到的方法:

def __getattr__(self, attr):
    self.__dict__[attr] = globals()[attr.capitalize()]("a", "b")
    return self.__dict__[attr]

这不是返回属性值的方法??我不明白。您如何访问“client.tokens”?令牌在哪里初始化?
\uuuu getattr\uuu
分配新属性,但不返回它;只有在随后的调用中(由
\uuuuu getattribute\uuuuu
处理),该属性才真正返回到调用方。感谢评论中的正确答案:)