我像这样在python中上课
import numpy as np
class BackPropogationNetwork:
# Static lambdas
sigmoid = lambda x : 1/(1+np.exp(-x))
sigmoid_prime = lambda sigmoid: sigmoid(1-sigmoid)
这是构造函数
def __init__(self):
self.some_attr = self.sigmoid(2)
我收到此错误
TypeError: <lambda>() takes exactly 1 argument (2 given)
如果我这样打电话
self.some_attr = ClassName.sigmoid()
我收到此错误
TypeError: unbound method <lambda>() must be called with BackPropogationNetwork instance as first argument (got int instance instead)
答案 0 :(得分:5)
你需要将lambdas包装在staticmethod
objects:
class BackPropogationNetwork:
sigmoid = staticmethod(lambda x : 1/(1+np.exp(-x)))
sigmoid_prime = staticmethod(lambda sigmoid: sigmoid(1-sigmoid))
lambda
表达式仍然使用不同的(有限的)语法生成函数对象。同样的规则适用于在类中定义函数;如果你想要它是一个静态方法,那么你仍然需要包装它们。
答案 1 :(得分:2)
所以你的sigmoid函数有点独立于类,将它保持在外面是有意义的,除非:
你希望这个方法给我覆盖。
让我们假设你已经下定决心,没有任何东西可以改变它,那么在这种情况下你可以做到这一点。
当你调用类似self.method()
的方法时,python将第一个参数传递给实例self的函数,所以你可以像这样使你成为lambda:sigmoid = lambda self, x : 1/(1+np.exp(-x))
或者你可以做别人建议做的事情,比如把它变成静态方法,因为staticmethod是一个装饰器,(带函数的函数)它可以这样调用
In [1]: class A:
...: s = staticmethod(lambda x: x)
...: def a(self):
...: print self.s(10)
...:
In [2]: f = A()
In [3]: f.a()
10
答案 2 :(得分:0)
你的两个sigmoid不是类方法。这意味着当你调用它们时,它们会将Class视为隐含的第一个参数。
此错误
TypeError: <lambda>() takes exactly 1 argument (2 given)
发生此呼叫
self.some_attr = self.sigmoid(2)
因为类实例对象与int 2一起被隐式传递。但是你的sigmoid被定义为只接受一个参数。
我认为你不会得到这个错误
TypeError: unbound method <lambda>() must be called with BackPropogationNetwork instance as first argument (got int instance instead)
通过此次通话
self.some_attr = ClassName.sigmoid()
你应该得到的错误应该是这样的。
TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'type'
在输入问题时,您可能会犯了一个复制粘贴错误。