在追捕一个不起眼的错误,我无意中发现了一些通过这个小例子,最好的证明:继承numpy.vectorize-ED功能
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的方法,或者只是没有要求在Second
的构造super
修复。)
啊,MRO就是这个词。启发,谢谢! – 2013-02-13 20:30:56