from datetime import date class Student: def __init__(self, sid: str, name: str, height: str, birth_date: date | str, enrollment_date: date | str, class_name: str): self.sid = sid self.name = name.strip() self.height = int(height) # 转换为整数类型 self.birth_date = birth_date if isinstance(birth_date, date) else date.fromisoformat(birth_date) self.enrollment_date = enrollment_date if isinstance(enrollment_date, date) else date.fromisoformat(enrollment_date) self.class_name = class_name self._validation_errors = [] self._validate_height() self._validate_date() self._validate_name() def _validate_height(self) -> None: if not (50 <= self.height <= 250): self._validation_errors.append(f"身高{self.height}cm超出合理范围") def _validate_name(self) -> None: if not (2 <= len(self.name) <= 20) or not self.name.isprintable(): self._validation_errors.append("姓名长度需在2-20个字符之间且为可打印字符") if not self.name.isprintable(): self._validation_errors.append("姓名长度需在2-20个字符之间") def _validate_date(self) -> None: today = date.today() if self.birth_date > today: self._validation_errors.append('出生日期不能在未来') if self.enrollment_date > today: self._validation_errors.append('入学日期不能在未来') if self.birth_date > self.enrollment_date: self._validation_errors.append('入学日期不能早于出生日期') @property def is_valid(self) -> bool: return len(self._validation_errors) == 0 def get_errors(self) -> list[str]: return self._validation_errors.copy() def __eq__(self, other) -> bool: if not isinstance(other, Student): return NotImplemented return (self.sid == other.sid and self.name == other.name and self.height == other.height and self.birth_date == other.birth_date and self.enrollment_date == other.enrollment_date and self.class_name == other.class_name ) @classmethod def from_dict(cls, data: dict) -> 'Student': birth_date = data['birth_date'] if isinstance(data['birth_date'], date) else date.fromisoformat( data['birth_date']) enrollment_date = data['enrollment_date'] if isinstance(data['enrollment_date'], date) else date.fromisoformat( data['enrollment_date']) return cls( sid=data['sid'], name=data['name'].strip(), height=data['height'], birth_date=birth_date, enrollment_date=enrollment_date, class_name=data['class_name'] ) def to_dict(self): return { 'sid': self.sid, 'name': self.name, 'height': self.height, 'birth_date': self.birth_date.isoformat(), 'enrollment_date': self.enrollment_date.isoformat(), 'class_name': self.class_name } def __repr__(self) -> str: return ( f"{self.__class__.__name__}(" f"sid='{self.sid}', " f"name='{self.name}'," f"height={self.height}," f"birth_date=date({self.birth_date.year},{self.birth_date.month},{self.birth_date.day}), " f"enrollment_date=date({self.enrollment_date.year},{self.enrollment_date.month},{self.enrollment_date.day}), " f"class_name='{self.class_name}'" f")" )