如何使用__getattr__访问动态创建的对象的属性

时间:2015-06-03 09:55:04

标签: 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 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

我做错了什么?

1 个答案:

答案 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}}