【发布时间】:2021-04-28 16:08:18
【问题描述】:
我正在尝试通过类变量调用外部函数。以下是我真实代码的简化:
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)
如果我在类方法setUpClass() 中使用MyClass 代替cls,情况似乎没有改变。
我希望MyClass.func_ref 的类型在分配setUpClass() 之后是function,这解释了我尝试调用它时得到的TypeError。为什么我分配给func_ref的值是function类型时,它的类型会变成instancemethod?
这似乎只是 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 的类型在我为它分配 function 类型的值时最终会变成 instancemethod。
【问题讨论】:
标签: python python-2.7 static-methods class-method