gpt4 book ai didi

python - 为什么type(list.append)返回Builtin_function_or_method而不是function * or *方法?

转载 作者:太空宇宙 更新时间:2023-11-03 20:25:37 25 4
gpt4 key购买 nike

这是一个非常简单的Python代码。

items = [1, 2, 3]

sqr_list = []
for i in items:
sqr_list.append(i**2)
sqr_list


每次我运行这条线

type(sqr_list.append)


我懂了

builtin_function_or_method


根据 Python doclist.append(x)是一种方法

Python中的所有内容都是对象,几乎所有内容都具有属性和方法。

在这种特定情况下,sqr_list是列表对象,而 sqr_list.append是列表对象的方法之一。

为什么不能确定list.append是方法而不是函数?

最佳答案

简短答案:

[].append不是功能或方法,它是builtin_function_or_method的对象。

更长的答案:

type返回类。 “方法”是通用语言术语,而不是类名。因此[].appendbuiltin_function_or_method类的可调用对象。
如果将[].append放在变量fun中,则可以将其用作函数fun(),但这是list的方法,不是吗?

实际上,您可以将任何方法用作函数或方法,也可以将任何函数用作方法(将其放入CLASS_NAME.__dict__)。 callable是唯一重要的事情。

因此,它不是功能*或*方法。它只是function_or_method

长答案:


一切都是对象。 [2, 2, 3]<class 'list'>也是对象。
一切都是某个类的对象。 [1, 2]<class 'list'>的对象。 <class 'list'><class 'type'>的对象,<class 'type'>是其自身的对象。
如果a具有A魔术方法,则可以调用类A的对象__call__<class 'int'>是可调用的,因为<class 'type'>具有__call__,这类似于

def __call__(self, *args, **kwargs):
obj = self.__new__(*args, **kwargs)
self.__init__(obj, *args, **kwargs)
return obj

如果 a具有 A__get__,则对象 __set__是描述符。很难描述描述符如何工作,但是...

A__get__的类

aA的对象,它是 B.__dict__的元素,即 aB的“字段”。

bB的对象

当您编写 b.a时,python请参见 A.__get__(a, b, B)。如果 a<class 'function'>的对象,则 a是描述符,而 b.a__get__<class 'function'>方法的结果,这是 <class 'method'>的对象。法律上都相同-方法 a。但是实际上 B.a是描述符,而 b.a不是 B.a。从某种意义上说,它们都是方法和函数。


CPython将类 builtin_function_or_method用于...内置函数或方法。

Python是抽象的另一个杠杆,它对于诸如方法之类的东西太灵活:方法可用作函数,而函数可用作方法。
是的,有类 functionmethod,但是它们都是函数和方法。

因此,方法和函数之间没有很强的区分。但是有可调用的对象,描述符。如果可以调用某项,则可以将其用作函数。

list.appendmethod_descriptor,因为它是描述符并用作方法。

[].appendbuiltin_function_or_method。它是内置函数,由描述符 list.append返回。但是可以认为是方法。从某种意义上说,它是方法,而在其他方面,则是功能。

不可能将内置函数和内置方法划分为不同的类型,也没有理由。

关于python - 为什么type(list.append)返回Builtin_function_or_method而不是function * or *方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57841815/

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