面向对象基础
# 面向对象基础
## 类和对象
- **类(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 语法特性