Проблемы с примером искажения имени

Я не делал ООП в Python какое-то время, поэтому я сделал краткий обзор некоторых функций, которые я забыл использовать. Когда я пришел к искажению имен в Учебном руководстве по Python ( https://docs.python.org/3/tutorial/classes.html), я скопировал пример, чтобы я мог играть вокруг с этим, и это не сработало! Я снова просмотрел его, чтобы убедиться, что я не ввел опечаток, а затем скопировал и вставил его, но он сказал мне, что я передаю неверное количество аргументов. Я либо совершил невероятно глупую ошибку, либо случилось что-то странное. Кто-нибудь знает, почему это произошло? Я использую последнюю версию: 3.6.5.

Чтобы вы могли убедиться, что я все правильно ввел, вот моя попытка назвать mangle:

class Mapping:
    def __init__(self, iterable):
        self.items_list = []
        self.__update(iterable)

    def update(self, iterable):
        for item in iterable:
            self.items_list.append(item)

    __update = update   # private copy of original update() method

class MappingSubclass(Mapping):

    def update(self, keys, values):
        # provides new signature for update()
        # but does not break __init__()
        for item in zip(keys, values):
            self.items_list.append(item)

def main():
    foo = MappingSubclass(['a'], ['b'])

if __name__ == "__main__":
    main()

и вот исключение:

Traceback (most recent call last):
  File "C:/Users/Hanni/OneDrive/Documents/Programs/Python/temp.py", line 24,     in <module>
    main()
  File "C:/Users/Hanni/OneDrive/Documents/Programs/Python/temp.py", line 21, in main
    foo = MappingSubclass(['a'], ['b'])
TypeError: __init__() takes 2 positional arguments but 3 were given

1 ответ

Решение

Таким образом, каждая функция в классе имеет self в качестве первого параметра. Этот параметр автоматически заполняется как ссылка на экземпляр объекта. Когда вы звоните

foo = MappingSubclass(['a'], ['b'])

Вы действительно звоните:

__init__(foo, ['a'], ['b'])

self - это не аргумент, который вы вводите при вызове функций класса, он хранится как ссылка на экземпляр класса, на который вы ссылаетесь

Поскольку вы определили, что init принимает только два аргумента, self и iterable, и вы указали три аргумента, вы получите ошибку.

Другие вопросы по тегам