Ошибка типа: __init __ () отсутствует 1 обязательный позиционный аргумент: ветви, но аргумент указан - PullRequest
0 голосов
/ 22 мая 2019

У меня есть подкласс другого класса. Оба имеют одинаковую подпись для метода __init__. Мой абонент предоставляет все необходимые аргументы. Тем не менее, я все еще получаю ошибку отсутствующего аргумента.

Я пробовал разные способы вызова метода __init__ суперкласса.

Функция инициализации базового класса (импортирована из другого файла):

class Gerrit:
    connections = {
        'consumer': MyGerritClient(host='gerrit.consumer.com', username=getpass.getuser()),
        'b2b': MyGerritClient(host='gerrit.b2b.com', username=getpass.getuser())
    }

    def __init__(self, segment, rev_id, branches):
        print("TRACE: Gerrit::__init__()")
        self.branches = branches
        self.review = None  # Type: GerritChange
        self.gerrit_client = self.connections[segment]
        for review_candidate in self.gerrit_client.query(rev_id):
            if self.branch_is_valid(review_candidate.branch) and review_candidate.status != 'ABANDONED':
                self.review = review_candidate
        self.approved = False
        self.rev_id = rev_id
        self.merged = False

Детский класс __init__ Метод:

class CvGerrit(Gerrit):
    def __init__(self, segment, rev_id, branches):
        Gerrit.__init__(segment, rev_id, branches)

Caller:

review = CvGerrit(segment='consumer', rev_id=gerrit_id, branches=my_branches)

Я ожидаю, что смогу создать дочерний класс, CvGerrit. Вместо этого я получаю отсутствующую ошибку позиционного аргумента. Имеет ли значение, что другие применения базового класса принимают list для аргумента ветвей, в то время как вызывающая сторона передает dict? Это преднамеренная и вся причина подкласса в том, что я могу обрабатывать эту коллекцию по-разному, используя переопределенную функцию в дочернем элементе.

1 Ответ

1 голос
/ 22 мая 2019

Вы хотите позвонить либо

Gerrit.__init__(<b>self, </b>segment, rev_id, branches)

или

super().__init__(segment, rev_id, branches)

Сам по себе __init__ - это просто еще один функциональный объект, поэтому при доступе к нему через класс вы должны передать все параметры, включая self. Когда вы обращаетесь к нему через экземпляр или super, вы получаете связанный метод с self, уже предварительно вставленным в список аргументов.

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