gpt4 book ai didi

python - 在python中传递静态方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:55:22 35 4
gpt4 key购买 nike

您能解释一下为什么以下代码片段不起作用吗?

class A:
@staticmethod
def f():
print('A.f')

dict = {'f': f}

def callMe(g):
g()

callMe(A.dict['f'])

它产生

TypeError: 'staticmethod' object is not callable

有趣的是,把它改成

class A:
@staticmethod
def f():
print('A.f')

dict = {'f': f}

def callMe(g):
g()

callMe(A.f)

或到

class A:
@staticmethod
def f():
print('A.f')

dict = {'f': lambda: A.f()}

def callMe(g):
g()

callMe(A.dict['f'])

给出了预期的结果

A.f

据我所知,Python 2 和 3 中的行为是相同的。

最佳答案

A 中的f 对象是一个descriptor ,而不是静态方法本身——当使用 A 的实例调用时,它返回静态方法;阅读链接,并查找“描述符协议(protocol)”以获取有关其工作原理的更多信息。方法本身存储为描述符的 __func__ 属性。

你可以自己看看:

>>> A.f
<function A.f at 0x7fa8acc7ca60>
>>> A.__dict__['f']
<staticmethod object at 0x7fa8acc990b8>
>>> A.__dict__['f'].__func__ # The stored method
<function A.f at 0x7fa8acc7ca60>
>>> A.__dict__['f'].__get__(A) # This is (kinda) what happens when you run A.f
<function A.f at 0x7fa8acc7ca60>

另请注意,您可以使用A.__dict__ 来访问f 描述符对象,您不需要制作自己的字典来存储它。

关于python - 在python中传递静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43004182/

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