如何在 Python class 中模拟 .users.get?

How to emulate .users.get in Python class?

我想创建一个具有属性 .users.get 并且没有在 class 中实现它们的虚构微型class(我打算使用这个 class 作为 MagicMock(spec=This_Class)) 中的替代品。我读过 getattr 但我不知道如何正确实施它。也许你能帮我弄清楚吗?

class A(object):
  def __getattr__(self, attr):
    if attr == 'users':
        self.__getattr__(self.users, 'get')
    if attr == 'get':
        return [{'uid': 4444444}]

__getattr__ 仅在未找到 users 时才会调用。因为你显然有一个 self.users 它会被发现并 returned.

__getattribute__ 将被调用(几乎总是),并允许您拦截 returned 值。

最佳方法恕我直言:

class A(object):

    def __getattribute__(self, attrname):
        try:
            attr = object.__getattribute__(self, attrname)
        except AttributeError as e:
            raise e

        if attrname == 'users':
            attr = attr.get()

        return attr

根据评论编辑:

class A(object):

    def __getattr__(self, attrname):
        if attrname == 'users':
            return self

        if attrname == 'get'
            return self

        raise AttributeError('{} not found'.format(attrname))

    def __call__(self)
        return [{'uid': 4444444}]

一个属性不能return你想要的list,因为你想调用这个属性。这意味着您必须 return self 然后 self 将被调用,就好像它是 usersget 方法一样,并且 return list(其中嵌入了 dict