Наследование класса, в котором класс __init__ вызывает внутренние функции - PullRequest
0 голосов
/ 15 сентября 2018

Я собираюсь унаследовать класс от библиотеки, но метод __init__ этого класса вызывает некоторые функции из своих внутренних модулей.Однако я тоже не хочу использовать эти функции.Имейте в виду, что я не хочу менять код в библиотеке.Я думаю, что библиотека имеет плохой дизайн, вызов определенных функций в вашем методе __init__ не облегчает жизнь людям, которые хотят использовать наследование.Если это другой метод, чем __init__, я мог бы переопределить метод, но мне нужно вызвать super из моего класса __init__ метода.

Вот код, иллюстрирующий ситуацию.Давайте начнем с библиотеки:

# library: inside of module a
class BaseClass(object):
    def __init__(self, *args, **kwargs):
        # initialize params
        from utils import some_func, some_dict
        some_func(...)
        for key in some_dict.keys():
            # do stuff


# library: inside of module utils
some_dict = {...}
def some_func(args): # do stuff

Вот мой код:

# inside of a one module.
from A import BaseClass
class SubClass(BaseClass):
    def __init__(self, *args, **kwargs):
        super(SubClass, self).__init__(*args, **kwargs)

# Also I have implementation for the dict and some_func.
# inside of module a (my code not the library)
some_dict = {...}
def some_func(args): # do stuff

Итак, проблема в том, что если я сделаю вызов BaseClass '__init__, он будетиспользовать собственную реализацию в своем модуле, а не мою реализацию для some_dict и some_func в модуле a.У меня есть несколько решений, но я хотел бы понять, что является лучшей практикой.

Возможные решения

Использование метода __new__ внутри подкласса.

class SubClass(BaseClass):
    # ...
    def __new__(typ, ...):
       import library.a
       from a import some_dict, some_func
       library.a.some_dict = some_dict # replace it with my dict.
       library.a.some_func = some_func # replace it with my function.

Недостаток: что делать, если я не хочуизменить реализацию библиотеки для другого метода.Решение: я могу изменить это временно.После инициализации я могу вернуть эти значения обратно.Может быть.Другая проблема: что, если мне нужно изменить эти переменные раньше?

Используйте пакет __init__.py, чтобы изменить эти переменные в самом начале.

# inside of `__init__`.py of my package. Very beginning. 
import library.a
from a import some_dict, some_func
library.a.some_dict = some_dict # replace it with my dict.
library.a.some_func = some_func # replace it with my function.

Есть ли хорошая практика для этой проблемы?Я думаю, что в этом случае я могу изменить значения some_dict и some_func при выполнении всего кода, так что, как вы думаете, какое решение может быть лучше для каких условий?Неправильно ли я считаю, что реализация BaseClass проблематична, поскольку она более сложна, чем должна быть (например, импорт модулей, вызов функций из этих внутренних модулей)?Я думаю, что было бы лучше, если бы они делали эти вызовы в отдельных функциях, чтобы я мог их переопределить.Или __init__ может принимать dict и аргумент функции относительно них, чтобы я мог предоставить его при создании объекта.

Каков наилучший метод для этой ситуации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...