Навлизам в сериозно ООП с Python и се натъквам на някои проблеми. Имам клас с инициализатор, три частни променливи и set и get методи за всяка променлива.
Освен това има метод за въвеждане, който позволява на потребителя да въведе стойност за променливите, когато те бъдат извикани, вместо да изисква извикване input
в главната функция, която предава стойност на метода на набора от класове. По този начин мога незабавно да валидирам потребителския запис в рамките на метода, специфичен за изискванията за данни:
def input_first_name(self):
done = 0
while done == 0:
print("Input First Name:",end='')
first_name = input()
if first_name.isalpha():
self.__first_name = first_name
done = 1
else:
print("Invalid Entry. Please use alphabetic characters only.")
Използвайки тези методи за въвеждане, имам друг метод, който ги използва за създаване на нов екземпляр на клас (само изчакайте, вече знам какво си мислите):
@classmethod
def new(cls):
cls.input_first_name(cls)
cls.input_last_name(cls)
cls.input_birthday(cls)
return cls
Така че знам, че използвайки това, всъщност няма да създам нов екземпляр. Използването на методите обаче не води веднага до никакви грешки. Но когато се позовавам на моето новосъздадено копие с метода get, това е мястото, където изпадам в проблеми, които знам, че са свързани с липсата на инстанциране.
new_relative = Relative.new()
print(new_relative.get_first_name())
води до:
TypeError: get_first_name() missing 1 required positional argument: 'self'
Има ли начин да имам метод на клас, използваем в моята основна функция за инстанциране на нов екземпляр, който използва моята идея за потребителско въвеждане и валидиране по прост и елегантен начин?
За справка, минимална извадка от класа:
class Relative:
__first_name = ""
__last_name = ""
__birthday = 0
def __init__(self, first_name,last_name,birthday):
self.__first_name = first_name
self.__last_name = last_name
self.__birthday = birthday
def get_first_name(self):
return self.__first_name