# 面向对象基础 ## 类和对象 - **类(Class)**:模板/蓝图,定义对象的属性和方法 - **对象(Object)**:类的实例,具体的存在 ### 定义类 ```python 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})" ``` ### 创建对象 ```python 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),类内部可用 | ```python 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` 语句 ```python 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 语法特性