当前位置:首页>python>Python 面向对象:多态、鸭子类型、魔法特殊方法(__str__ / __repr__ / __len__ / __getitem__)

Python 面向对象:多态、鸭子类型、魔法特殊方法(__str__ / __repr__ / __len__ / __getitem__)

  • 2026-10-11 08:12:28
Python 面向对象:多态、鸭子类型、魔法特殊方法(__str__ / __repr__ / __len__ / __getitem__)

一、多态

1. 什么是多态

同一种调用方式,不同子类有不同实现
父类引用指向子类对象,调用同名方法,自动执行子类重写的逻辑。

2. 多态前提

  1. 1. 有继承关系
  2. 2. 子类重写父类方法
  3. 3. 统一接口调用

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)"

区别:

  • • __str__:给用户看
  • • __repr__:给开发者看,还原对象结构

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. 常用其他魔法方法(了解)

  • • __init__:构造方法,创建对象自动执行
  • • __del__:对象被销毁时自动执行
  • • __call__:对象可以像函数一样 obj() 调用
  • • __add__:支持 对象1 + 对象2 加法运算

示例 __call__:

classTest:
def__call__(self):
print("对象被当作函数调用")

t = Test()
t()   # 自动触发 __call__

四、核心总结

1. 多态

  • • 继承 + 方法重写
  • • 统一接口,不同子类不同行为

2. 鸭子类型

  • • 不强制继承
  • • 有对应方法就可以用,Python 特色

3. 特殊魔法方法

方法
作用
__str__
print(对象) 友好输出
__repr__
开发者调试、控制台展示
__len__
支持 len(对象)
__getitem__
支持 对象[索引] 取值
__call__
支持 对象() 调用

最新文章

随机文章