为什么可以直接调用类方法的引用,而不能直接调用实例方法的引用?

为什么可以直接调用类方法的引用,而不能直接调用实例方法的引用?

承接上一个问题:Python 如何直接调用类方法的引用?

python 为什么可以直接调用 class method 的引用,而不能直接调用 instance method 的引用?

使用 instance method 的引用不 ok

from typing import Callable

from loguru import logger

class Work:

def run(self, data: str):

logger.debug(data)

method = Work.run

method('哈哈')

报错了:

─➤  python -u "/home/bot/Desktop/ideaboom/011.py"

Traceback (most recent call last):

File "/home/bot/Desktop/ideaboom/011.py", line 17, in <module>

method('哈哈')

TypeError: Work.run() missing 1 required positional argument: 'data'

但是使用 class method 就 ok

from typing import Callable

from loguru import logger

class Reload:

@classmethod

def wait(cls,data:str):

logger.debug(data)

method=Reload.wait

method('哈哈')

一切正常

─➤  python -u "/home/bot/Desktop/ideaboom/011.py"

2022-08-03 00:10:58.491 | DEBUG | __main__:wait:9 - 哈哈


回答:

python 的 function 绑定一个类对象之后成为一个 instance method。instance method 通过 __self__ 记录绑定的对象,通过 __func__ 属性记录绑定的函数。调用 instance method 的时候,会把 __self__ 属性自动插入到参数列表的第一个,然后调用 __func__

instance method 可用通过 类实例.方法 的形式生成。方法需要时定义在类里的,而不是类示例的属性。直接使用 类.方法 是不能生成 instance method 的,只能得到原始的函数。

@classmethod 是一个 magic 。他是一个 python 内置类,可以使得在得到 instance method 的时候, __self__ 上绑定类本身而不是类对象,并且在使用 类.方法 的时候也可以完成绑定,得到 instance method 。

所以,Woker.run 需要传第一个参数,因为它是一个普通的函数,不是 instance method。

Reload.wait 则不需要传第一个参数,因为它是一个 instance method ,已经绑定了第一个参数。

以上是 为什么可以直接调用类方法的引用,而不能直接调用实例方法的引用? 的全部内容, 来源链接: utcz.com/p/938565.html

回到顶部