gpt4 book ai didi

Python:将函数重新绑定(bind)为 int

转载 作者:太空宇宙 更新时间:2023-11-03 16:26:23 26 4
gpt4 key购买 nike

我有一个测试类:

class TestClass:
def someFunction(self, someInt):
self.i = someInt
return self.i

并且正在测试它:

x = MyClass()
x.someFunction = 3
print(x.someFunction)
x.someFunction(4)

但是,这会导致TypeError: 'int' object is not callable。我明白为什么我会收到此错误 - someFunction 已反弹为整数(在本例中为 3),并且整数不是函数,因此 someFunction 不再可调用。但我想知道允许成员函数像数据成员一样反弹背后的原因是什么?似乎很容易出现意外错误。我刚刚开始学习 Python,感觉我错过了 Python 的一个基本方面,而这种行为适合。

最佳答案

这是允许的,因为 Python 中属性查找的工作方式是这样设计的。在 Python 中,许多在其他语言中不鼓励、禁止或不可能的事情可以利用您的用例(如果使用得当)。当然,更多的权力意味着更多的责任。

After all, we're all consenting adults here.

有关属性解析的一些背景信息

类实例以空的 __dict__ 属性开始,其中存储了所有对象属性。通过访问 x.someFunction,您隐式地尝试 x.__dict__['someFunction']。如果x.__dict__中不存在'someFunction',则对x的类进行相同的尝试,即type(x ).someFunction 或更好的 type(x).__dict__['someFunction']

当您通过执行 x.someFunction = 3 写入 x 时,实际发生的是 x.__dict__['someFunction'] = 3 ,无论读取属性访问可能返回什么。

唯一真正的(?)魔法发生在方法调用期间,其中自动提供 self,即 x.someFunction(4) 解析为 type( x).__dict__['someFunction'](x, 4) 而不是 type(x).__dict__['someFunction'](4)x.__dict__[' someFunction'](4)。这与属性访问有些关系,可能会引起困惑。

因此,您实际上并没有“重新绑定(bind)”该函数,而是用 x 的实例属性 someFunction 隐藏类属性 someFunction。如果你这样做

print(MyClass.someFunction)
print(MyClass().someFunction)

你会看到该方法仍然存在。您甚至可以使用以下命令恢复初始状态

del x.__dict__['someFunction']

注意:我所描述的分辨率说明了这个概念。实际上,Python 的内部工作原理可能更微妙或更复杂,但它们会产生相同的效果。例如,在 Python 2 中,方法在存储到类字典中之前已被包装为所谓的非绑定(bind)方法This has been dropped in Python 3 ,其中类字典包含普通函数。

关于Python:将函数重新绑定(bind)为 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37961175/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com