一、多态
1. 什么是多态
同一种调用方式,不同子类有不同实现
父类引用指向子类对象,调用同名方法,自动执行子类重写的逻辑。
2. 多态前提
3. 多态示例
classAnimal:
defspeak(self):
pass
classDog(Animal):
defspeak(self):
print("汪汪汪")
classCat(Animal):
defspeak(self):
print("喵喵喵")
# 多态函数
defanimal_speak(a: Animal):
a.speak()
animal_speak(Dog())
animal_speak(Cat())
特点:同一个函数,传入不同子类,行为不一样。
二、鸭子类型(Duck Typing)
1. 口诀
长得像鸭子、走路像鸭子、叫声像鸭子,它就是鸭子
2. 含义
Python 不严格要求继承父类,
只要类里有对应的方法/属性,就可以当成同一种类型使用。
3. 示例
不需要继承 Animal,只要有 speak 方法就行:
classDog:
defspeak(self):
print("汪汪汪")
classCat:
defspeak(self):
print("喵喵喵")
defanimal_speak(obj):
obj.speak()
animal_speak(Dog())
animal_speak(Cat())
核心:不看类型,只看有没有对应方法。
三、特殊方法(魔法方法)
前后双下划线 __xxx__,内置自动触发,不用手动调用。
1. __str__ 字符串打印
作用:print(对象) 时自动触发,给用户看的友好字符串。
classPerson:
def__init__(self, name, age):
self.name = name
self.age = age
def__str__(self):
returnf"姓名:{self.name},年龄:{self.age}"
p = Person("小明", 18)
print(p) # 自动调用 __str__
2. __repr__ 官方表示
作用:交互式控制台、直接敲对象变量时触发,给开发者看。
- • 如果没定义
__str__,会用 __repr__ 顶替。
classPerson:
def__repr__(self):
return"Person('小明', 18)"
区别:
3. __len__ 支持 len(对象)
让自定义对象支持 len() 函数。
classMyList:
def__init__(self, data):
self.data = data
def__len__(self):
returnlen(self.data)
obj = MyList([1,2,3,4])
print(len(obj)) # 4
4. __getitem__ 支持下标取值 obj[n]
让对象像列表/字典一样用索引取值。
classMyList:
def__init__(self, data):
self.data = data
def__getitem__(self, index):
returnself.data[index]
obj = MyList([10,20,30])
print(obj[1]) # 20
5. 常用其他魔法方法(了解)
- •
__call__:对象可以像函数一样 obj() 调用 - •
__add__:支持 对象1 + 对象2 加法运算
示例 __call__:
classTest:
def__call__(self):
print("对象被当作函数调用")
t = Test()
t() # 自动触发 __call__
四、核心总结
1. 多态
2. 鸭子类型
3. 特殊魔法方法
| |
__str__ | |
__repr__ | |
__len__ | |
__getitem__ | |
__call__ | |