Как создать класс, который дает информацию о человеке
я только начинаю программировать на питоне, прошу помощи. В чем суть: надо создать класс Person, который дает информацию о человеке и имеет:
- вложенный класс Sex -представляет пол человека, имеет следующие значения: MALE - мужчина, FEMALE - женщина атрибуты:
- first_name - имя,
- last_name - фамилия,
- age - возраст, не должен быть больше 150 (игнорировать попытки установить возраст больше этого числа),
- sex - пол, хранит экземпляры вложенного класса Sex
методы:
- конструктор, принимающий на входе значения для всех атрибутов класса
- метод проверки на равенство с другим экземпляром класса Person на основе значений всех атрибутов
- метод для преобразования экземпляра класса Person в строку, строковое представление должно отображать значения всех свойств, например: Петр Петров, мужчина, 18. код:
class Person:
class Sex:
def __init__(self, MALE, FEMALE):
def __init__(self, first_name: str, last_name: str, age: int, sex: Person.Sex):
def age(self, value: int):
if value <= 150:
self.age = value
def __eq__(self, other: Person) -> bool:
return (self.first_name, self.last_name, self.age, self.sex) ==
(other.first_name, other.last_name, other.age, other.sex)
def __str__(self) -> str:
return f"{self.first_name} {self.last_name}, {self.age}, {self.sex}"
Класс Person я создал, попытался создать вложенный класс, но похоже сделал неверно, но я не знаю как правильно надо сделать, сделал конструктор, метод для проверки равенства и метод преобразования в строку. Но не работает, как сделать так, чтобы в конструкторе можно было вводить значения,а потом все выводилось в строку? Заранее благодарю
Ответы (1 шт):
Смотрите, первое, что приходит в голову, нужно понять, что при создании объекта Sex() нужно указать такие же и такое же количество аргументов, как в конструкторе. У Вас конструктор принимает на вход два аргумента(MALE, FEMALE), которые потом обрабатываются как переменные, которые хранят какое-то значение. Вы действительно хотите вызывать каждый раз что-то вроде Пол(мужской=да, женский=нет)? Не думаю, что Вы хотели этого. Следовательно, можно обойтись простой строкой с полом. Тогда будет вот так:
class Person:
def __init__(self, first_name: str, last_name: str, age: int, sex: str):
self.first_name = first_name
self.last_name = last_name
self.age(age)
self.sex = sex
def age(self, value: int):
if value <= 150:
self.age = value
def __eq__(self, other) -> bool:
return (self.first_name, self.last_name, self.age, self.sex) == (other.first_name, other.last_name, other.age, other.sex)
def __str__(self) -> str:
return f'{self.first_name} {self.last_name}, {self.age}, {self.sex}'
p = Person('Иван', 'Sidorv', 30, 'male')
Тут будет небольшая проблема с тем, что пол может быть и slkjdhfksjhdf и собака, а не только male | female. Но можно обойтись без вложенных классов, которые, кстати, не совсем понятно, зачем нужны...
Можно добавить кастомный для проверки пола. Тогда и безопаснее сеттер, и вложенные классы пригодились. Будет вот так:
class Person:
class Sex:
_suitable_sexes = ('male', 'female')
def __init__(self, value):
if value in self._suitable_sexes:
self._value = value
else:
while value not in self._suitable_sexes:
value = input(f'Пол не подходит. Введите новый {self._suitable_sexes}: ')
self._value = value
def get_value(self):
return self._value
def __init__(self, first_name: str, last_name: str, age: int, sex: str):
self.first_name = first_name
self.last_name = last_name
self.age(age)
self.sex = Person.Sex(sex).get_value()
def age(self, value: int):
if value <= 150:
self.age = value
def __eq__(self, other) -> bool:
return (self.first_name, self.last_name, self.age, self.sex) == (other.first_name, other.last_name, other.age, other.sex)
def __str__(self) -> str:
return f'{self.first_name} {self.last_name}, {self.age}, {self.sex}'
p = Person('Иван', 'Sidorv', 30, 'mle')
К другим мелочам.
- Всегда, когда у Вас непонятно, что будет в функции, не решили, что написать, пишите
pass. Иначе питон будет кусаться. - Не надо подсказывать питону того, чего он не знает пока. В конструкторе нельзя передать имя своего же класса.
Пока вроде все