import logging

# 配置日志系统:
# - 设置日志级别为 DEBUG,意味着所有 DEBUG 及以上级别的日志都会被记录;
# - 定义日志输出格式,包括时间戳、日志记录器名称、日志级别和消息内容;
# - 同时将日志输出到文件 'class.log' 和控制台(标准输出)。
logging.basicConfig(
level=logging.DEBUG,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('class.log'), # 将日志写入文件 class.log
logging.StreamHandler() # 同时在控制台打印日志
]
)

# 定义一个基础人类 Person 类
class Person:
species = "人类"
def __init__(self, name, age):
"""初始化 Person 实例,设置姓名和年龄"""
self.name = name
self.age = age

def introduce(self) -> str:
"""返回一个自我介绍的字符串"""
return f"Hello {self.name}, you are {self.age} years old!"


# 定义 Student 类,继承自 Person 类
class Student(Person):
def __init__(self, name, age, student_id):
"""初始化 Student 实例,在父类基础上增加学号属性"""
super().__init__(name, age) # 调用父类 Person 的 __init__ 方法
self.student_id = student_id # 添加学生特有的学号属性

def introduce(self) -> str:
"""重写父类的 introduce 方法,包含学号信息"""
return f"Hello {self.name}, you are {self.age} years old! your student id is {self.student_id}"

@classmethod
def class_method(cls):
"""类方法 - 只能访问类属性,不能访问实例属性"""
return f"这是{classmethod},物种是{cls.species}"

@classmethod
def create_baby(cls, name):
"""类方法作为工厂方法,创建特定类型的实例"""
return cls(name, age=0)


# 定义一个函数用于检查学生年龄是否合法
def checkAge(student) -> str:
"""
检查传入的 student 对象的年龄是否小于 18 岁。
如果年龄 >= 18,则抛出 ValueError 异常,认为其不符合“学生”身份;
否则返回表示信息有效的字符串。
"""
if student.age >= 18:
raise ValueError("年龄太大,不是学生")
return "学生信息有效"

# 程序入口点:当该脚本被直接运行时执行以下代码
if __name__ == '__main__':
# 创建一个 Person 实例
p = Person("peter", 35)
# 使用 logging 记录其自我介绍信息(INFO 级别)
logging.info(p.introduce())

# 创建一个 Student 实例
s = Student("John", 17, 1)
# 使用 logging 记录其自我介绍信息(INFO 级别)
logging.info(s.introduce())

# 调用 checkAge 函数验证学生年龄是否有效
# 此处 John 年龄为 17,不会触发异常
checkAge(s)
# @classmethod 类方法,只能访问类实体的属性,没法访问对象
print(Student.class_method())
# 可以通过类方法创建对象,
print(Student.create_baby("John"))
posted on 2025-12-03 17:24  程序员丁先生  阅读(7)  评论(0)    收藏  举报