在寻找一个不起眼的错误时,我偶然发现了这个最小示例最能证明的东西:
import numpy as np
class First(object):
def __init__(self):
self.vF = np.vectorize(self.F)
print "First: vF = ", self.vF
def F(self, x):
return x**2
class Second(First):
def __init__(self):
super(Second, self).__init__()
print "Second: vF = ", self.vF
def F(self, x):
raise RuntimeError("Never be here.")
def vF(self, x):
return np.asarray(x)*2
我希望 的实例Second
有一个明确定义的vF
方法,但情况似乎并非如此:
arg = (1, 2, 3)
f = First()
print "calling first.vF: ", f.vF(arg)
s = Second()
print "calling second.vF: ", s.vF(arg)
生产
First: vF = <numpy.lib.function_base.vectorize object at 0x23f9310>
calling first.vF: [1 4 9]
First: vF = <numpy.lib.function_base.vectorize object at 0x23f93d0>
Second: vF = <numpy.lib.function_base.vectorize object at 0x23f93d0>
calling second.vF:
Traceback (most recent call last):
...
RuntimeError: Never be here.
所以看起来s.vF
和f.vF
是同一个对象,即使s.vF == f.vF
是False
。
这是预期/已知/记录的行为,并且numpy.vectorize
不能很好地继承,还是我在这里遗漏了一些简单的东西?(当然,在这种特殊情况下,问题很容易通过更改First.vF
为普通的 Python 方法来解决,或者只是不调用super
的Second
构造函数。)