Вы определили 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
объектов).