2016-01-22 29 views
1

我想創建一個具有屬性.users.get的虛擬微類,並且不需要在類內實現它們(我打算將此類用作MagicMock中的一個子集(spec = This_Class))。我已閱讀了getattr,但我不知道如何正確實施它。也許你能讓我知道嗎?如何在Python類中模擬.users.get?

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

我看你已經接受了答案。但是我仍然沒有完全理解你的問題(直到我在接受的答案中閱讀你的評論之前,我才理解這個「召喚」)。你想使用MagicMock,還是避免它?什麼是This_Class?什麼是'A'? – MariusSiuram

回答

1

__getattr__只有在未找到users的情況下才會被調用。由於你顯然有self.users它會被發現並返回。

__getattribute__將被調用(幾乎總是),並允許您截取返回的值。

最好的辦法恕我直言:

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將被調用,好像它是的usersget方法,將(在它與嵌入式dict)返回list

+0

我想補充一點,我想稍後再調用它:mocked_object.users.get()[0] ['uid'] – paus

+0

attr.get()在哪裏實現? – paus

+0

我認爲評論與問題不符。如果你想調用'users',你根本不需要'__getattr__'或'__getattribute__'。你的屬性'users'將會被返回,這個屬性將會**有'get'方法。否則解決方案是返回實例。讓我添加第二個選項 – mementum