Python面向对象编程
九、object类与特殊方法重写
-
object类地位
• 所有类的基类(顶级父类)
• 默认包含多个内置方法 -
常用特殊方法重写
class Student:
def __init__(self, name): # 初始化方法
self.name = name
def __str__(self): # 对象字符串表示
return f"Student: {self.name}"
def __del__(self): # 对象销毁时调用
print(f"{self.name}对象被回收")
stu = Student("小明")
print(stu) # 输出:Student: 小明
十、运算符重载与特殊方法
运算符/操作 | 对应方法 | 功能说明 | 示例实现 |
---|---|---|---|
+ | __add__(self, other) | 加法运算 | return self.value + other |
- | __sub__ | 减法运算 | |
* | __mul__ | 乘法运算 | |
/ | __truediv__ | 真除法 | |
// | __floordiv__ | 整除运算 | |
% | __mod__ | 取模运算 | |
** | __pow__ | 幂运算 | |
< | __lt__ | 小于比较 | return self.age < other.age |
== | __eq__ | 等于比较 | |
len() | __len__ | 返回长度 | return len(self.items) |
in | __contains__ | 成员检测 | return key in self.data |
示例实现:
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __str__(self):
return f"({self.x}, {self.y})"
v1 = Vector(2, 3)
v2 = Vector(1, 4)
print(v1 + v2) # 输出:(3, 7)
十一、对象特殊属性
特殊属性 | 描述 | 访问示例 |
---|---|---|
obj.__dict__ | 对象属性字典(实例级别) | print(stu.__dict__) |
obj.__class__ | 对象所属类 | print(type(stu) is stu.__class__) |
class.__bases__ | 类的父类元组(继承关系) | print(Student.__bases__) |
class.__base__ | 类的第一个父类 | |
class.__mro__ | 方法解析顺序(继承层次) | print(Child.__mro__) |
class.__subclasses__() | 类的直接子类列表 | print(Parent.__subclasses__()) |
十二、拷贝机制详解
拷贝类型 | 操作方式 | 特点 | 图示说明 |
---|---|---|---|
赋值 | = | 创建对象引用(共享内存) | [→] 原对象 |
浅拷贝 | copy.copy() | 创建新对象,但嵌套对象保持引用 | [→] 原对象→嵌套对象 |
深拷贝 | copy.deepcopy() | 递归创建全新对象(完全独立副本) | [→] 全新对象 |
示例代码:
import copy
class CPU:
def __init__(self, model):
self.model = model
class Computer:
def __init__(self, cpu):
self.cpu = cpu
# 原始对象
c1 = Computer(CPU("i9"))
# 浅拷贝
c2 = copy.copy(c1)
c2.cpu.model = "i7" # 会影响c1的cpu
# 深拷贝
c3 = copy.deepcopy(c1)
c3.cpu.model = "AMD" # 不会影响原对象
知识图谱总结
高频面试考点
__new__
与__init__
的区别- 深拷贝对不可变对象的影响(如元组)
- MRO算法(C3线性化算法)
- 鸭子类型在实际框架中的应用(如Django ORM)
- 属性查找链(实例→类→父类→object)