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

如何在Python类中模拟.users.get?,python,class,methods,substitution,getattr,Python,Class,Methods,Substitution,Getattr,我想用attributes.users.get创建一个虚构的micro类,并且在类内部没有它们的实现(我计划在MagicMock中将这个类用作子类(spec=this_类))。我已经读过getattr,但不知道如何正确实现它。也许你能帮我弄明白 class A(object): def __getattr__(self, attr): if attr == 'users': self.__getattr__(self.users, 'get') if attr

我想用attributes.users.get创建一个虚构的micro类,并且在类内部没有它们的实现(我计划在MagicMock中将这个类用作子类(spec=this_类))。我已经读过getattr,但不知道如何正确实现它。也许你能帮我弄明白

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

只有在未找到
用户
的情况下,才会调用
\uuuu getattr\uuuu
。因为您显然有一个
self.users
,它将被找到并返回

\uuuu getattribute\uuuu
将被调用(几乎总是),并允许您截取返回值

最佳方法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}]

属性无法返回所需的
列表
,因为您希望调用该属性。这意味着您必须返回
self
,然后
self
将被调用,就像它是
users
get
方法一样,并将返回
列表
(其中嵌入了
dict

我想补充一点,稍后我想这样调用它:mocked_object.users.get()[0]['uid']那么attr.get()是在哪里实现的呢?我认为注释与问题不符。如果你想这样调用
用户
,你根本不需要
\uuu getattr\uuu
\uu getattribute\uu
。您的属性
users
将被返回,并且该属性将有一个
get
方法。否则,解决方案是返回实例。让我再加上第二个选项。我看你已经接受了答案。但我仍然没有完全理解你的问题(直到我在接受的答案中读到你的评论,我才理解“电话”)。你想使用MagicMock,还是避免?这门课是什么?什么是
A