我希望能够测试两个可调用对象是否相同.我更喜欢身份语义(使用"是"运算符),但我发现当涉及方法时,会发生不同的事情.
#(1) identity and equality with a method
class Foo(object):
def bar(self):
pass
foo = Foo()
b = foo.bar
b == foo.bar #evaluates True. why?
b is foo.bar #evaluates False. why?
Run Code Online (Sandbox Code Playgroud)
我用Python 2.7和3.3(CPython)重现了这一点,以确保它不是旧版本的实现细节.在其他情况下,身份测试按预期工作(翻译会议从上面继续):
#(2) with a non-method function
def fun(self):
pass
f = fun
f == fun #evaluates True
f is fun #evaluates True
#(3) when fun is bound as a method
Foo.met = fun
foo.met == fun #evaluates False
foo.met is fun #evaluates False
#(4) with a callable data …Run Code Online (Sandbox Code Playgroud) 我为此分配了一个插槽.
...
self.query = QtGui.QLineEdit(self)
self.query.textChanged.connect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.connect(lambda: self.launchNavigator(1))
...
Run Code Online (Sandbox Code Playgroud)
但我怎么能断开连接?我试过这个,但它不起作用......
self.query.textChanged.disconnect(lambda: self.makeThread(self.googleSearch()))
self.query.returnPressed.disconnect(lambda: self.launchNavigator(1))
Run Code Online (Sandbox Code Playgroud) 如果我有
class A:
def foo(self):
pass
Run Code Online (Sandbox Code Playgroud)
这评估为True:
getattr(A, 'foo') is A.foo
Run Code Online (Sandbox Code Playgroud)
但这评估为False:
a = A()
getattr(a, 'foo') is a.foo
Run Code Online (Sandbox Code Playgroud)
同样如此
a.foo is a.foo
Run Code Online (Sandbox Code Playgroud)
为什么?
我找到了getattr(a, 'foo'),a.foo两者都代表了
<bound method A.foo of <__main__.A object at 0x7a2c4de10d50>>)
Run Code Online (Sandbox Code Playgroud)
所以没有暗示....