gpt4 book ai didi

python - 对函数的类变量引用更改为 instancemethod

转载 作者:行者123 更新时间:2023-12-04 13:27:29 24 4
gpt4 key购买 nike

我正在尝试通过类变量调用外部函数。以下是我的真实代码的简化:

def func(arg):
print(arg)

class MyClass(object):
func_ref = None

@classmethod
def setUpClass(cls):
#MyClass.func_ref = func
cls.func_ref = func

@staticmethod
def func_override(arg):
print("override printing arg...")
MyClass.func_ref(arg)

if __name__ == "__main__":
print(type(func))
print(type(MyClass.func_ref))
MyClass.setUpClass()
print(type(MyClass.func_ref))
MyClass.func_override("hello!")
上面的代码产生以下输出:
[~]$ python tmp.py
<type 'function'>
<type 'NoneType'>
<type 'instancemethod'>
override printing arg...
Traceback (most recent call last):
File "tmp.py", line 20, in <module>
MyClass.func_override("hello!")
TypeError: func_override() takes exactly 2 arguments (1 given)
如果我使用 MyClass 情况似乎没有变化代替 cls在类方法内 setUpClass() .
我希望 MyClass.func_ref 的类型成为 functionsetUpClass() 中赋值后这解释了 TypeError当我尝试调用它时,我得到了。为什么是 func_ref的类型正在更改为 instancemethod当我分配给它的值是 function 类型时?
这似乎只是 Python 2 中的一个问题。 Python 3 的行为与我预期的一样。
如何调用静态方法 MyClass.func_override()调用 func() ?
更新
通过应用以下补丁,我能够使上述内容正常工作:
@@ -14,7 +14,7 @@ class MyClass(object):
def func_override(arg):
print("override printing arg...")
func(arg)
- MyClass.func_ref.__func__(arg)
+ MyClass.func_ref(arg)

if __name__ == "__main__":
print(type(func))
虽然上述方法有效,但我完全不清楚为什么我需要这样做。我还是不明白为什么 func_ref 的类型结束了 instancemethod当我分配给它一个 function 类型的值时.

最佳答案

只需将函数通过 staticmethod如下:

    @classmethod
def setUpClass(cls):
#MyClass.func_ref = func
cls.func_ref = staticmethod(func)
在这种情况下不需要使用基于 @ 的装饰器,因为您想修改方法绑定(bind)到 MyClass 的方式,而不是 func 的一般定义。 .
为什么这是必要的?因为,当您将方法分配给类时,Python 假定您要引用实例(通过 self )或类(通过 cls )。 self ,不像 this在JS中,只是一个命名约定,所以当看到 arg它假定它有一个实例,但您在调用中传递了一个字符串。
所以,正如 Python 所关心的,你也可以写 def func(self): .这就是为什么消息说 unbound method func() must be called with MyClass 👉instance👈 as first argument . staticmethod意思是,“请不要管它,不要在第一个变量中假设一个实例或一个类”。
您甚至可以省去 setUpClass entirely :
class MyClass(object):
func_ref = staticmethod(func)
顺便说一句:在 2021 年,即 EOL 后的 16 个月,Python 2.7 具有发霉的运动袜的所有微妙气味。除了不太安全,从病毒学角度来说。

关于python - 对函数的类变量引用更改为 instancemethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67303891/

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