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 odpowiedzi
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).
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)
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.