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

时间:2016-01-22 09:16:03

标签: python class methods substitution getattr

我想用属性.users.get创建一个虚构的微类,并且没有在类中实现它们(我计划在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}]

1 个答案:

答案 0 :(得分:1)

只有在找不到__getattr__时才会调用

users。由于您显然有self.users,因此会找到并返回。

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

最好的方法imho:

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}]

属性无法返回您想要的list,因为您想要调用该属性。这意味着您必须返回self,然后self将被调用,就好像它是get的{​​{1}}方法一样,并将返回users(其中嵌入了list