forked from p3qolzsn9/stu1
大
parent
bf6a570974
commit
48034a176b
@ -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')
|
||||
)
|
Loading…
Reference in new issue