Muszę wykonać następujące ćwiczenie:

Zaimplementuj klasę PersonReader obsługującą następujące metody:

input () pyta użytkownika o imię i rok urodzenia osoby po znaku zachęty powłoki (używając wbudowanej funkcji wejściowej).

str , który zwraca ciąg „nazwa (rok)” (np. do użycia przez metodę drukowania po zastosowaniu do PersonReader).

A moim pomysłem było zrobienie czegoś takiego:

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)

Jednak powoduje to błąd, gdy próbuję wywołać Personreader.from_input (x) lub Personreader.from_input (). Jak mogę zaimplementować te dane wejściowe użytkownika w mojej klasie?

2
Jacobiman 19 marzec 2020, 11:16

2 odpowiedzi

Najlepsza odpowiedź

Zdefiniowałeś from_input jako metodę zwykłą , co oznacza, że jej pierwszy parametr to zawsze self (bez względu na to, jaką nazwę mu nadasz) i musi zostać wywołany instancja lub dostarczona z instancją.

Aby uczynić from_input alternatywnym konstruktorem (co wydaje się być tutaj intencją), należy przekształcić go w metodę klasy , dekorując ją @classmethod. W takim przypadku nazwa (pierwszego) parametru powinna mieć postać cls np.

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

Nawiasem mówiąc, Twoja implementacja __str__ jest błędna. __str__ powinien zwrócić wizualizację obiektu jako ciąg znaków, nie powinien go wydrukować . Jeśli potrzebujesz jakiejś drukarki, dodaj metodę z taką nazwą, np. print_object. Ewentualnie napraw __str__, a potem po prostu print(reader) lub cokolwiek innego.

Wreszcie, klasy są zwykle CamelCased w Pythonie, więc powinno być PersonReader nie Personreader. Chociaż nie jest jasne, do czego służy część czytelnik , twoja klasa to po prostu osoba, którą można przypadkowo zdefiniować na podstawie danych wejściowych (potocznie czytniki to obiekty, które mogą ładować dane z pliku lub obiekty podobne do plików, np. csv.reader, więc PersonReader byłoby czymś, co analizuje plik lub obiekt podobny do pliku i ładuje jeden lub więcej Person obiektów).

5
Masklinn 19 marzec 2020, 08:24

Zgadzam się z punktami wymienionymi w odpowiedzi udzielonej przez @Masklinn

Oto, co możesz, aby to działało

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)
-2
Aashish Pawar 19 marzec 2020, 10:35