Как мне получить имя дочернего класса Python при вызове издевательского метода родительского класса?

#python #python-3.x #mocking #python-unittest #pyside2

#python #python-3.x #издевательство #python-unittest #pyside2

Вопрос:

У меня есть тонна диалоговых окон и мастеров в большом приложении QT / Python, но я не могу определить, какой дочерний класс запускает родительский метод exec_. Есть ли способ сделать это с помощью mock или любой другой библиотеки? Конечно, я могу найти его через debug, но мне нужен программный способ сделать это.

 import mock
from PySide2 import QtWidgets

class CustomDialog(QtWidgets.QDialog):
    pass


class AnotherCustomDialog(QtWidgets.QDialog) :
    pass


def launch_custom_dialog() :
    dlg = CustomDialog() 
    dlg.exec_() 


with mock.patch.object(QtWidgets.QDialog, 'exec_') as mock_dialog:
    test_which_calls_launch_custom_dialog()
    if mock_dialog.called:
        # How do I find the name of the child? I.e. CustomDialog
  

Ответ №1:

Если вы вызываете это самостоятельно:

 def launch_custom_dialog() :
    dlg = CustomDialog()    # or could be any of your custom dialogs
    dlg.exec_()
    return dlg
  

Затем вы можете создать свой собственный промежуточный базовый класс:

 class CustomDialogBase(QtWidgets.QDialog):
    def exec_(self, *args, **kwargs):
        self.note_caller = self
        return super().exec_(*args, **kwargs)

class CustomDialog(CustomDialogBase):
    pass
class AnotherCustomDialog(CustomDialogBase) :
    pass
  

Теперь вы можете проверить, какой это был дочерний класс:

 dlg = launch_custom_dialog()
print(dlg.note_caller)
  

Комментарии:

1. Это отличный ответ. Спасибо. Это соответствует моему упрощенному примеру, однако на самом деле создание экземпляра dlg происходит глубоко внутри вложенных вызовов тестового примера, поэтому я не могу легко захватить его экземпляр. Я надеялся, что внутри самого макета найдется способ получить доступ к классу издеваемой функции.