侧边栏壁纸
博主头像
phphi

phphi's blog

  • 累计撰写 51 篇文章
  • 累计收到 0 条评论

Day17 - 面向对象基础

2026-4-24 / 0 评论 / 2 阅读

面向对象基础

类和对象

  • 类(Class):模板/蓝图,定义对象的属性和方法
  • 对象(Object):类的实例,具体的存在

定义类

class Student:
    """学生类"""

    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score
        self._grade = self._calc_grade()

    def _calc_grade(self):
        """内部方法:计算等级"""
        if self.score >= 90: return 'A'
        elif self.score >= 80: return 'B'
        elif self.score >= 70: return 'C'
        elif self.score >= 60: return 'D'
        return 'F'

    def introduce(self):
        return f"我叫{self.name},{self.age}岁,成绩{self.score}分,等级{self._grade}"

    def __str__(self):
        return f"Student(name={self.name}, age={self.age}, score={self.score})"

    def __repr__(self):
        return f"Student({self.name!r}, {self.age!r}, {self.score!r})"

创建对象

stu = Student('Alice', 18, 92)
print(stu.introduce())  # 我叫Alice,18岁,成绩92分,等级A
print(stu)              # Student(name='Alice', age=18, score=92)

成员可见性

类型 命名规则 说明
公开成员 name 可随意访问
受保护成员 _name 约定不可直接访问,类内部和子类可用
私有成员 __name 名称改名(Name Mangling),类内部可用
print(stu.name)      # Alice - 公开成员
print(stu._grade)    # A - 受保护(约定不访问)
# stu.__score        # AttributeError - 私有成员
print(stu._Student__score)  # 92 - 强制访问(不推荐)

特殊方法

  • __init__:构造器,创建对象时初始化
  • __str__/__repr__:字符串表示,print() 调用 __str__
  • __lt__/__le__:比较运算,支持 <<=
  • __eq__:相等判断
  • __hash__:可哈希,用于集合/字典键
  • __len__/__getitem__:支持 len()、索引访问
  • __enter__/__exit__:上下文管理器,支持 with 语句
class Rect:
    def __init__(self, w, h):
        self.w, self.h = w, h

    @property
    def area(self):
        return self.w * self.h

    def __eq__(self, other):
        return self.area == other.area

    def __lt__(self, other):
        return self.area < other.area

总结

  • 类是模板,对象是实例;__init__ 初始化实例属性
  • 公开/受保护/私有成员通过命名约定区分
  • 特殊方法(魔术方法)让对象支持 Python 语法特性