あいまいなバグを探しているときに、この最小限の例で最もよく示されているものに出くわしました。
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.vFs.vF == f.vFFalse
これは予想される/既知の/文書化された動作でありnumpy.vectorize、継承とうまく機能しませんか、それともここで簡単なものが欠けていますか?(確かに、この特定のケースではFirst.vF、通常のPythonメソッドに変更するか、コンストラクターを呼び出さないことで、問題を簡単に修正できます。super)Second