鸭子类型与猴子补丁

鸭子类型

在Python里, 鸭子类型指的是对于一个对象, 只需要关心它的方法, 而不用关心它的类型

例如我们自定义一个类, 如果我们定义了__getitem__, 那这个类就可以切片取值, 不用非要是抽象基类的子类, 或者列表的子类, 看下面的例子

class MyClass:

    def __init__(self):
        self.value = list(range(10))

    def __getitem__(self, index):
        return self.value[index]
m = MyClass()
print(m[0])
print(m[2])
$ m = MyClass()
$ print(m[0])
0
$ print(m[2])
2

运行正常

猴子补丁

还是上面的例子, 如果我们对其中的一个索引重新赋值:

$ m[2] = 'a'
Traceback (most recent call last):
  File "test5.py", line 14, in 
    m[2] = 'a'
TypeError: 'MyClass' object does not support item assignment

会报错, 因为我们没有给这个类定义__setitem__方法, 我们可以在类里面加上, 也可以加上猴子补丁

def setitem(obj, index, value):
    obj.value[index] = value


MyClass.__setitem__ = setitem

这样重新赋值就可以了

这就是猴子补丁

你可能感兴趣的:(鸭子类型与猴子补丁)