Tob*_*ler 5 python monkeypatching python-2.x instance-methods
鉴于一类A我只是可以添加一个instancemethod a通过
def a(self):
pass
A.a = a
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试添加另一个类B的instancemethod b,即A.b = B.b调用的尝试A().b()产生一个
TypeError:b()必须使用B实例作为第一个参数调用unbound方法(没有任何东西)
(虽然B().b()很好).确实存在差异
A.a -> <unbound method A.a>
A.b -> <unbound method B.b> # should be A.b, not B.b
Run Code Online (Sandbox Code Playgroud)
所以,
奇怪的是,这在Python3中不再失败......
让我们:
class A(object): pass
class B(object):
def b(self):
print 'self class: ' + self.__class__.__name__
Run Code Online (Sandbox Code Playgroud)
当你这样做时:
A.b = B.b
Run Code Online (Sandbox Code Playgroud)
您没有将函数附加到A,而是附加未绑定的方法.因此,python只将其添加为标准属性,并且不将其转换为A-unbounded方法.解决方案很简单,附加底层功能:
A.b = B.b.__func__
print A.b
# print: <unbound method A.b>
a = A()
a.b()
# print: self class: A
Run Code Online (Sandbox Code Playgroud)
我不知道未绑定的方法和函数之间的所有区别(只有第一个包含第二个),而不是内部的所有工作方式.所以我无法解释它的原因.我的理解是方法对象(绑定与否)需要比函数更多的信息和功能,但它需要执行一个.
我同意自动执行此操作(更改未绑定方法的类)可能是一个不错的选择,但我可以找到不这样做的理由.令人惊讶的是,python 3与python 2不同.我想找出这个选择的原因.
| 归档时间: |
|
| 查看次数: |
586 次 |
| 最近记录: |