method () отсутствует 1 обязательный аргумент: 'self', в то время как method () не нужны никакие параметры - PullRequest
0 голосов
/ 07 января 2019

Итак, чтобы освоить ООП-программирование, нам поручено строить классы. Эти классы должны позволять нам получать input () через терминал. Например, введите «a» для получения списка всех книг.

Это мой первый метод, и он не хочет работать. Он НЕ ДОЛЖЕН принимать никаких параметров, он не нуждается в каких-либо параметрах, поскольку есть один список, который он должен прочитать.

Итак, мой код выглядит так:

from Library import *

while(True):

print("blabla explaining how to use the program, do you want to 'a', print a list of all books, 'b'.....")
user_choice = input

if(user_choice == 'a'):
    Library.list_books()
if(user_choice == 'b'):
    #etc. 

И метод библиотеки выглядит следующим образом:

from Book import *

def list_books(self):
    for Book.Book in Book.book_list:
        print(Book.Book.name)

Как видите, для работы ему ничего не нужно. Почему тогда, что он хочет параметр. Очевидно, что если я уберу «я», это сработает, но это, насколько я знаю, не принято. Единственное исправление, которое я нашел, это добавление @classmethod. Мой начальник не одобрил это и назвал это обманом.

Может быть, я не до конца понял, что такое «я» делает / есть, но сейчас все, что я знаю, это то, что это не работает, и у меня нет идей. Я все еще исследую это, но или я слишком глуп, или источники не делают хорошую работу, объясняя это мне. Я только что программировал Python уже около 2 недель и имею ОЧЕНЬ умеренные навыки Java, поэтому мои общие знания по программированию все еще ограничены. Если у вас есть источники, которые хорошо это объясняют или которые вам помогут, я буду очень рад их прочитать.

Заранее спасибо!

1 Ответ

0 голосов
/ 07 января 2019

Параметр self часто добавляется в методы автоматически IDE. Он в основном используется, когда метод содержится внутри класса.

Возьмем, к примеру, класс Book ниже.

class Book:
    author = ""
    title = ""

    def __init__(self, author, title):
        self.author = author
        self.title = title

    def print_book_information(self):
        print("'%s' by %s" % (self.title, self.author))

Поскольку вы только начинаете с ООП, многое из этого будет немного запутанным. Сначала мы объявляем тип класса Book.

class Book:

Следующие две строки объявляют переменные, связанные с классом Book. В этом случае мы хотим сохранить author книги, а также title книги.

    author = ""
    title = ""

Следующие две функции, если вы заметили, обе имеют параметр self. Параметр self ссылается на созданную вами книгу. так что если я создам книгу примерно так:

my_book = Book('Ayn Rand', 'Atlas Shrugged')

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

self.author = author # Sets our author to be 'Ayn Rand'
self.title = title   # Sets our title to be 'Atlas Shrugged'

Теперь, когда наш класс создан, мы можем сделать что-то вроде

>>> my_book.print_book_information()
'Atlas Shrugged' by Ayn Rand

Обратите внимание на метод print_book_information как мы используем слово self для ссылки на нашего автора и название? self по существу позволяет методу узнать, какую именно книгу вы просматриваете. В противном случае метод не будет знать, для какой книги вы хотите получить название или автора.

Кроме того, в вопросе вы отметили, что у вас очень мягкий фон Java. self выполняет функцию, аналогичную ключевому слову this из Java, за исключением того, что вы должны включить его в качестве параметра в Python, тогда как вы не ссылаетесь на него в параметрах в Java. Следующие два метода по сути одинаковы:

# Python
class Hello:
    def say_hello(self):
        print("Hello!")

// Java
public class Hello
{
    public void say_hello()
    {
        System.out.println("Hello!");
    }
}

Может быть опечатка или два в Java, не использовал его в течение последних 5 лет или около того.

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