鸭子类型(Duck Typing)
鸭子类型是对Python中数据类型本质上是由属性和行为来定义的一种解读
Python是一种动态语言,不像Java和C++这种强类型语言,Python里实际上没有严格的类型检查
只要某个对象具有鸭子的方法,可以像鸭子那样走路和嘎嘎叫,那么它就可以被其它函数当做鸭子一样调用
示例:
class Duck:
def __init__(self, name):
self.name = name
def bark(self):
print("gay... gay...gay...")
def swim(self):
print("A duck named " + self.name + " is swimming...")
class Goose:
def __init__(self, name):
self.name = name
def bark(self):
print("goo... goo...goo...")
def swim(self):
print("A doose named " + self.name + " is swimming...")
- 设计一个duck_show函数,其设计的本意是需要传入一个Duck对象作为参数的
- 分别构建Duck类以及Goose类的对象,并传入duckshow函数进行调用
def duck_show(duck: Duck):
duck.swim()
duck.bark()
if __name__ == '__main__':
yaya = Duck("yaya")
ee = Goose("ee")
duck_show(yaya)
duck_show(ee)
'''
输出:
A duck named yaya is swimming...
gay... gay...gay...
A doose named ee is swimming...
goo... goo...goo...
'''
由于Python是动态语言,没有严格类型检查,Goose这个类具有和Duck这个类相同的方法,ee这只鹅划起水来像只鸭子,叫起来也像一只鸭子,所以duckshow这个函数也可以对ee进行作用,故Python其数据类型属于鸭子类型。
猴子补丁(Monkey Patching)
猴子补丁是一种在运行时动态修改类或模块行为的技巧。它允许程序在运行时修改已有的代码,通常用于修复bug、添加新功能或改变现有类的行为,而不需要修改原始代码。猴子补丁可以通过直接修改类或模块的属性来实现。
示例:
class MyClass:
def my_method(self):
print("Original Method")
# 猴子补丁:在运行时修改MyClass的my_method方法
def new_method(self):
print("Modified Method")
MyClass.my_method = new_method
obj = MyClass()
obj.my_method() # 输出: Modified Method
在这个例子中,我们定义了一个 MyClass 类和一个 my_method 方法。然后,我们通过将 MyClass 的 my_method 属性替换为一个新的函数 new_method 来实现猴子补丁。这样,所有后续创建的 MyClass 实例在调用 my_method 时都会执行 new_method 函数。
总结
- 鸭子类型 是一种动态类型系统的概念,它基于对象能够执行的操作来确定其行为,而不是基于对象的类型。
- 猴子补丁 是一种在运行时动态修改类或模块行为的技巧,通常用于修复bug、添加新功能或改变现有类的行为。