Как написать init для дочернего класса этого класса? - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь написать подкласс из этого класса:

class InsertCreateAlter(object):

def __init__(self, url=None, engine=None, connection=None, session=None,
             **kwargs):
    if connection is not None:
        self.engine = connection
    elif engine is not None:
        self.engine = engine
    elif session is not None:
        self.engine = session
    else:
        self.engine = sqlalchemy.create_engine(url, **kwargs)

Это была моя попытка:

class InsertCreateAlterEAV(InsertCreateAlter):


def __init__(self, url=None, engine=None, connection=None, session=None,
             **kwargs):
    InsertCreateAlter.__init__(self, url=None, engine=None, connection=None, session=None,
             **kwargs)
    if connection is not None:
        self.engine = connection
    elif engine is not None:
        self.engine = engine
    elif session is not None:
        self.engine = session
    else:
        self.engine = sqlalchemy.create_engine(url, **kwargs)

Когда я вызываю функцию как:

InsertCreateAlterEAV(session=session)

Я получил ошибку:

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/IPython/core/interactiveshell.py", line 3267, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-4-ee54fec26f76>", line 2, in <module>
    InsertCreateAlterEAV(session=session)
  File "/Users/asportelli/Documents/gitRepos/etl/etl/eav/InsertCreateAlterEAV.py", line 18, in __init__
    **kwargs)
  File "/Users/asportelli/Documents/gitRepos/etl/etl/insert/InsertCreateAlter.py", line 27, in __init__
    self.engine = sqlalchemy.create_engine(url, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/sqlalchemy/engine/__init__.py", line 425, in create_engine
    return strategy.create(*args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/sqlalchemy/engine/strategies.py", line 52, in create
    plugins = u._instantiate_plugins(kwargs)
AttributeError: 'NoneType' object has no attribute '_instantiate_plugins'

1 Ответ

3 голосов
/ 28 мая 2019

Вы не должны дублировать код родительского класса.Сделайте это так:

class InsertCreateAlterEAV(InsertCreateAlter):
    def __init__(self, url=None, engine=None, connection=None, session=None,
                 **kwargs):
        # Do you have code you want to run before running the parent's __init__?
        # Maybe adding default arguments or changing one of them?
        # Then add that code here.

        # init the parent
        super().__init__(url=url,
                         engine=engine,
                         connection=connection,
                         session=session,
                         **kwargs)

        # Here you can add code after the parent's init code. Maybe for
        # initializing subclass-specific attributes.

Если вы все еще используете Python 2, используйте InsertCreateAlter.__init__(self, ...


Теперь посмотрим, в чем проблема.Вы вызываете свой подкласс следующим образом:

InsertCreateAlterEAV(session=session)

, тогда ваш подкласс вызывает метод родительского класса '__init__, но с session=None.Таким образом, родительский класс принимает эту ветвь:

else:
        self.engine = sqlalchemy.create_engine(url, **kwargs)

, и поскольку kwargs пусто, только url (то есть None) передается в create_engine(). Этот метод не знает, как поступить с url==None.

Таким образом, вы получите исключение.

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