diff --git a/面向对象学生系统/data/__init__.py b/面向对象学生系统/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/面向对象学生系统/data/students.csv b/面向对象学生系统/data/students.csv new file mode 100644 index 0000000..e69de29 diff --git a/面向对象学生系统/models/students.py b/面向对象学生系统/models/students.py new file mode 100644 index 0000000..f679581 --- /dev/null +++ b/面向对象学生系统/models/students.py @@ -0,0 +1,67 @@ +from datetime import date +from typing import Optional, Union +from dataclasses import dataclass + + +@dataclass +class Student: + name: str + id_card: str + stu_id: str + gender: Optional[bool] = None # True:男, False:女 + height: Optional[int] = None # cm + weight: Optional[float] = None # kg + enrollment_date: Optional[Union[date, str]] = None + class_name: Optional[str] = None + major: Optional[str] = None + + @property + def age(self) -> int: + """从身份证号计算年龄(周岁)""" + from utils.id_utils import calculate_age + return calculate_age(self.id_card) + + @property + def birthday(self) -> date: + """从身份证号提取出生日期""" + from utils.id_utils import extract_birthday + return extract_birthday(self.id_card) + + def to_dict(self) -> dict: + """将学生对象转换为字典""" + return { + 'name': self.name, + 'id_card': self.id_card, + 'stu_id': self.stu_id, + 'gender': self.gender, + 'height': self.height, + 'weight': self.weight, + 'enrollment_date': self.enrollment_date.isoformat() + if isinstance(self.enrollment_date, date) else self.enrollment_date, + 'class_name': self.class_name, + 'major': self.major + } + + @classmethod + def from_dict(cls, data: dict) -> 'Student': + """从字典创建学生对象""" + from datetime import datetime + + enrollment_date = data.get('enrollment_date') + if enrollment_date and isinstance(enrollment_date, str): + try: + enrollment_date = datetime.strptime(enrollment_date, '%Y-%m-%d').date() + except ValueError: + pass + + return cls( + name=data['name'], + id_card=data['id_card'], + stu_id=data['stu_id'], + gender=data.get('gender'), + height=data.get('height'), + weight=data.get('weight'), + enrollment_date=enrollment_date, + class_name=data.get('class_name'), + major=data.get('major') + ) \ No newline at end of file