Различное поведение в базовом классе __init__ в зависимости от производного класса - PullRequest
0 голосов
/ 29 апреля 2019

У меня есть абстрактный класс Base, содержащий логический член do_thing, который либо запускает одноразовое действие при запуске, либо ничего не делает. Эта переменная может быть переопределена производным классом Derived, но выполнение вызова super().__init__() в начале Derived __init__ приводит к тому, что одноразовое действие всегда основано на установленном do_thing в Base.

Я вижу только два варианта решения этой проблемы, ни один из которых не кажется мне идеальным:

  1. Вызывайте super().__init__() в конце каждого производного класса __init__, а не в начале, что означает, что я не могу полагаться на другие переменные по умолчанию, установленные в Base.

  2. Явно вызывайте одноразовое действие в конце каждого производного класса __init__, что означает либо дублированный код, либо дополнительную функцию в Base, которая будет вызываться только при запуске.

Пример кода

from abc import ABC

class Base(ABC):
    def __init__(self):
        self.do_thing = False

        # Want to wait for child class init before running this
        if self.do_thing:
            configuration.set(do_thing_parameters) 


class Derived(Base):
    def __init__(self):
        super().__init__()
        # Should have configs properly set based on this being true
        self.do_thing = True

class RegularDerived(Base):
    def __init__(self):
        super().__init__()
        # Don't modify the config

Есть ли лучший способ сделать это, что мне не хватает?

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

По вашему описанию кажется, что ваша do_thing функциональность связана с вашими классами, а не с вашими экземплярами.Если это так, то неправильно указывать его в качестве параметра __init__.У вас есть другие варианты, и я бы выбрал

Атрибут класса

class Base:
    _do_thing = False

    def __init__(self):
        if self._do_thing:
            configuration.set(do_thing_parameters)

class Derived(Base):
    _do_thing = True

class RegularDerived(Base):
    pass

Тогда вам даже не нужно определять __init__ в подклассах

0 голосов
/ 29 апреля 2019

Попробуйте установить переменную do_thing в качестве параметра по умолчанию, как показано ниже ...

from abc import ABC

class Base(ABC):
    def __init__(self, do_thing=False):
        if do_thing:
            configuration.set(do_thing_parameters) 


class Derived(Base):
    def __init__(self):
        super().__init__(True)
...