Проблема с алмазом в Python: вызов метода из всех родительских классов - PullRequest
1 голос
/ 21 октября 2019

ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ ВОПРОС ПЕРВЫМ, ПЕРЕД Пометкой ЭТОГО ДУБЛИКАТА!

Этот вопрос задают многие, но почти все дали то же решение, которое я уже применял.
Итак, у меня есть классы TestCase, B, C, D & E.
Классы C & D наследуют класс B & class E наследуют оба C & D. Класс B наследует TestCase.

Когда я запускаю свой код, класс E работает только с методами для класса C и все время игнорирует D.
Теперь мои классы идут так:

class GenericAuthClass(TestCase):

    def setUp(self):
        """Create a dummy user for the purpose of testing."""
        # set some objects and variabels

    def _get_authenticated_api_client(self):
        pass

class TokenAuthTests(GenericAuthClass):

    def _get_authenticated_api_client(self):
        """Get token recieved on login."""
        super()._get_authenticated_api_client()
        # make object
        return object

class BasicAuthTests(GenericAuthClass):

    def _get_authenticated_api_client(self):
        """Get token recieved on login."""
        super()._get_authenticated_api_client()
        # make object
        return object

class ClientTestCase(BasicAuthTests, TokenAuthTests):
    def dothis(self):
        return self._get_authenticated_api_client()
  1. Как я могу вызвать метод (с тем же именем) в C и D из E, как проблема с алмазом в C++? На данный момент, когда я вызываю определенный метод, используя self.method() из E, он вызывает только этот метод из C и игнорирует тот же метод из D, хотя я думаю, что он должен вызывать оба метода. Обратите внимание, что метод не существует в классе E, и мой код работает сейчас без ошибок, а только вызывает метод из C.

Это похоже на Pythonвопрос в основном, но пометка django тоже, поскольку TestCase класс может иметь к этому какое-то отношение.

1 Ответ

0 голосов
/ 21 октября 2019

Этот ответ является правильным, когда он говорит

, что для завершения цепочки вызовов super необходимо использовать что-то вроде общего базового класса.

Это означает, что вам нужно написать собственный базовый класс, который находится между B и C и TestCase, который завершает цепочку super, реализуя ваши дополнительные методы и затем не делегируя никаких вызовов его родителям:

from django.test import TestCase

class MyTestBase(TestCase):
    def method1(self, arg):
        pass
    def method2(self, arg1, arg2):
        pass

class B(MyTestBase):
    def method1(self, arg):
        super().method1(arg)
        ...
    def method2(self, arg1, arg2):
        super().method2(arg1, arg2)
        ...

class C(MyTestBase):
    def method1(self, arg):
        super().method1(arg)
        ...
    def method2(self, arg1, arg2):
        super().method2(arg1, arg2)
        ...

class D(B, C):
    pass
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...