Вызов методов в конструкторе суперкласса или конструкторе подкласса? - PullRequest
2 голосов
/ 01 мая 2010

1. Передача конфигурации методу __init__, который косвенно вызывает register:

class Base:

    def __init__(self, *verbs):
        if not verbs:
          verbs = "get", "post"
        self._register(verbs)

    def _register(self, *verbs):
        pass


class Sub(Base):

    def __init__(self):
        super().__init__("get", "post", "put")

2. Вызов register явно в методе подкласса __init__:

class Base:

    def __init__(self):
        self._register("get", "post")

    def _register(self, *verbs):
        pass


class Sub(Base):

    def __init__(self):
        self._register("get", "post", "put")

Я использую Python 3.

Что лучше или более питонично? Или это только вопрос вкуса?

Ответы [ 4 ]

3 голосов
/ 01 мая 2010

Я думаю, что ни один из этих вариантов не подходит. Наиболее близким решением, вероятно, будет:

class Base(object):

    def __init__(self):
        self._register("get", "post")


class Sub(Base):

    def __init__(self):
        super(Sub, self).__init__()
        self._register("put")

Мне также интересно, не лучше ли зарегистрировать глаголы на уровне класса. Вероятно, они идентичны для всех экземпляров, так почему они регистрируются для каждого экземпляра индивидуально?

0 голосов
/ 03 мая 2010

Я бы определенно использовал первую форму. Я хотел бы задать себе вопрос: «Что если однажды будет изменена инициализация базового класса? Хочу ли я, чтобы подклассы извлекли выгоду из обновления или нет?» Почти во всем моем коде ответ звучит оглушительно: «Да»:)

0 голосов
/ 01 мая 2010

ИМХО, второй способ лучше. «Более питонический» способ - сделать вещи настолько явными, насколько это практически возможно. Вам не нужно будет искать конструктор родительского класса, чтобы увидеть, что он делает с этими аргументами ...

0 голосов
/ 01 мая 2010

Если все, что расширяет базовый класс, будет вести себя так, я бы лично вызвал конструктор базового класса. Если нет, и поведение меняется, я бы позвонил из подкласса ...

Что касается более Pythonic - не подписывайтесь на культ - напишите код, который работает ...

Martin

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