我有以下代码。
class SomeClass:
a = lambda self: self.b()
def __init__(self):
self.b = lambda self: None
s = SomeClass()
s.a()
它给我“TypeError :()正好取1个参数(0给定)”。我想了解原因。
我的解释:
a - class方法,因此s.a()
equlas SomeClass.a(s)
b - 对象的属性(不是方法,只是一个函数),这就是self.b()
不等于SomeClass.b(self)
的原因
因此a = lambda self: self.b()
b
的参数缺失。
我是对的吗?
P.S。是关闭效应吗?
class SomeClass:
a = lambda self: self.b()
def __init__(self):
self.data = 12
self.b = lambda: self.data
s = SomeClass()
print s.a() #12
s.data = 24
print s.a() #24
答案 0 :(得分:3)
这里的问题是绑定方法和函数之间的区别
有一个更简单的例子:
class Someclass(object):
bound = lambda *args: "bound method got {}".format(args)
def __init__(self):
self.unbound = lambda *args: "function got {}".format(args)
>>> c = Someclass()
如果仔细观察,这两个函数的类型不同:
>>> c.bound
<bound method Someclass.<lambda> of <__main__.Someclass object at 0x...>>
>>> c.unbound
<function Someclass.__init__.<locals>.<lambda> at 0x...>
结果,当我们打电话给他们时,他们会收到不同的论点:
>>> c.bound(1, 2, 3)
'bound method got (<__main__.Someclass object at 0x...>, 1, 2, 3)'
>>> c.unbound(1, 2, 3)
'unbound got (1, 2, 3)'
请注意,只有&#34;绑定&#34;函数传入了self
个参数。
在3.5 - 2.7中测试的名称可能略有不同