这一点Python让我感到困惑。
class my_class(object):
def f():
return 1
c = my_class()
f1 = c.f
f2 = c.f
assert not f1 is f2
assert id(f1) != id(f2)
assert f1 == f2
所有三个断言都通过了。前两个是相同的,但我希望两者都失败。
这对我来说似乎很奇怪。当我调用c.f
时,Python是否真的创建了新的,绑定的成员函数对象?为什么会这样做?
好的 - 看here,我想我的第一个问题的答案是肯定的。但是,在这种情况下,这种具有一致==
的不同ID的业务似乎完全是奇怪的。对于容器,当然,我想要is
和==
之间的分歧(即包含等效数据的两个不同的容器对象)。但对于成员函数,似乎is
和==
应该是等价的。
有人可以为我激励这一点Python设计吗?
编辑:经过进一步的反思,这对我来说是有意义的。为了使对象的内存占用量很小,必须根据请求创建绑定函数,因此每个请求都是不同的对象。