我试图用类重写一些代码。在某种程度上,我想要的是使用对象的每个实例的参数值为成员函数分配一个特定的定义。
来自其他语言(JavaScript、C++、Haskell、fortran……),我努力在Python上理解EME>理解EME>一些事情。一件事是在类内方法中self的以下区别。
例如,以下代码显然不起作用:class fdf:
def f(x):
return 666
class gdg(fdf):
def sq():
return 7*7
hg = gdg()
hf = fdf()
print(hf.f(),hg.f(),hg.sq())
这就产生了一个错误“sq()接受0个位置参数,但给了1个”。
据我所知,原因是在执行时间时,函数被传递到调用对象(实例调用sq)的引用,作为第一个参数,在我们可能已经定义/调用sq的任何其他参数/参数之前。所以解决方法很简单:将sq的代码改为def sq(self):。实际上,Python tutorial1似乎表明对象方法应该始终以self作为第一个参数来定义。这样我们就得到了预期的666 666 49。到现在为止,一直都还不错。
但是当我尝试像这样实现我的类时:class Activation:
def nonLinearBipolarStep(self,x,string=None):
if not string: return (-1 if x<0 else 1 )
else: return ('-' if x<0 else '1')
default='bipolar'
activationFunctions = {
'bipolar': nonLinearBipolarStep ,
}
def _getActivation(self,func=default):
return self.activationFunctions.get(func,self.activationFunctions.get(self.default))
def __init__(self,func=None):
if func == None: func=self.default
self.run = self._getActivation(func)
ag = Activation()
print(ag.run(4))
我明白错误nonLinearBipolarStep() missing 1 required positional argument: 'x'
然而,一个解决办法(解决方案??)正在定义不带参数self(!)的step函数作为def nonLinearBipolarStep(x,string=None):
然后我得到1的预期行为(至少对于这个琐碎的测试)。所以,这里不仅不需要self,而且这里的用法也不正确!
但是根据上面提到的教程,或者像this2或this3这样的线程中的答案,在我看来这段代码不应该工作…或者在某个点上应该会有一些意想不到的结果(?)。事实上,如果我删除了_getActivation定义中对self的所有引用,就会得到根据该规则可以理解的错误消息_getActivation() takes from 0 to 1 positional arguments but 2 were given。
class MyClass:
"""A simple example class"""
i = 12345
def f(self):
return 'hello world'
是吗?实例化这个类如预期的那样工作,但是如果用none定义,它会抱怨缺少参数(我知道它可能是任何标签)。
这让我怀疑我的代码是否以某种方式隐藏了一个定时炸弹:是否将self作为x的值传递?它按预期工作,所以我会说不,但我现在面临这个难题。
我想我错过了一些关于语言的关键概念。我承认我也很难回答参考文献3所问的问题。
[^]:在JS中,只需在函数体中使用this,函数本身被定义为对象原型的成员或实例成员,然后使用…this正确地分配实例成员。
编辑:
线很长。对于那些需要帮助的浏览者,如果您是Python新手,那么您可能需要检查选定的解决方案及其注释。但是,如果您已经知道Python中的绑定/解除绑定方法,那么只需要直接检查Blckknght的答案中描述的描述符的使用情况。最后,我在代码中选择了这种方式,在要运行的赋值中使用__get__。