Метод класса со встроенной функцией ввода (Python) - PullRequest
2 голосов
/ 19 марта 2020

Мне нужно выполнить следующее упражнение:

Реализовать класс PersonReader, поддерживающий следующие методы:

input () запрашивает у пользователя имя и год рождения человека по приглашению оболочки (используя встроенную функцию ввода).

str , которая возвращает строку «имя (год)» (например, для использования методом печати применительно к PersonReader).

И моя идея заключалась в том, чтобы сделать что-то вроде этого:

class Personreader:

    def __init__(self, name, year): 
        self.name = name
        self.year = year

    def from_input(x): 
        return x(input(),input())

    def __str__(self):
        print(self.name, self.year)

Однако это выдает ошибку, когда я пытаюсь вызвать Personreader .from_input (x) или Personreader.from_input (). Как реализовать этот пользовательский ввод в моем классе?

Ответы [ 2 ]

5 голосов
/ 19 марта 2020

Вы определили from_input как обычный метод , это означает, что его первый параметр всегда self (независимо от того, какое имя вы ему дадите), и он должен быть вызван в экземпляре или предоставляется с экземпляром.

Чтобы сделать from_input альтернативным конструктором (что здесь и задумано), вы должны превратить его в метод класса , украсив его @classmethod. В этом случае имя (первого) параметра должно быть cls например

    @classmethod
    def from_input(cls):
        return cls(input(), input())

Кстати, ваша реализация __str__ ошибочна. __str__ должен вернуть визуализацию объекта в виде строки, он не должен печатать его. Если вам нужен какой-нибудь принтер, добавьте метод с таким именем, например print_object. В качестве альтернативы, исправьте __str__, затем просто print(reader) или что-то еще.

Наконец, классы обычно имеют CamelCased в python, так что это должно быть PersonReader, а не Personreader. Хотя неясно, для чего нужна часть reader , ваш класс - это просто человек, который может быть определен случайно из входных данных (разговорно reader - это объекты, которые могут загружать данные из файла или файла- как объекты, например csv.reader, так что PersonReader будет что-то, что анализирует файл или файлоподобный объект и загружает один или несколько Person объектов).

0 голосов
/ 19 марта 2020

Я согласен с пунктами, упомянутыми в ответе @ Masklinn

Вот что вы можете сделать, чтобы это работало

class PersonReader:

 def __init__(self, name, year):
    self.name = name
    self.year = year
  @staticmethod
  def from_input():
    return PersonReader(input(),input())
  @classmethod
 def __str__(self):
    return str(self.name)+" ("+str(self.year)+")" #output as per required

p1 = PersonReader.from_input() #create person from input
print(p1.name) # name 
print(p1.year) # year
print(p1)
...