在 Python 中,鸭子类型(Duck Typing)是一种动态类型的风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。
换句话说,在鸭子类型中,关注的是对象的行为,而不是对象的类型。例如,在 Python 中,如果一个对象实现了__len__方法,那么它就可以被认为是一个“可迭代对象”,即使它并没有从iterable类继承。
这使得 Python 具有非常灵活和强大的特点。我们可以编写通用的函数或方法,而不需要关心它们接受的参数的具体类型,只要这些参数实现了特定的方法或属性。
以下是一个使用鸭子类型的示例:
def my_function(obj):
if hasattr(obj, 'my_method'):
# 调用对象的 my_method 方法
obj.my_method()
elif callable(obj):
# 调用对象本身
obj()
else:
print("这个对象不支持 my_function 操作。")
# 创建一个对象
obj1 = object()
obj1.my_method = lambda: print("这是对象 1 的方法。")
obj2 = lambda: print("这是对象 2。")
# 调用 my_function
my_function(obj1)
my_function(obj2)
my_function(123)
在这个例子中,my_function可以接受任何对象作为参数。它会根据对象的特性来执行不同的操作,而不需要关心对象的具体类型。
这就是鸭子类型的核心思想:关注对象的行为,而不是对象的类型。