Compare commits
No commits in common. 'DAL' and 'main' have entirely different histories.
@ -1,90 +0,0 @@
|
|||||||
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")"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in new issue