gpt4 book ai didi

python - 如何从类对象中区分python非类对象

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:57 25 4
gpt4 key购买 nike

我是 python 新手。我认为非类对象没有 bases 属性,而类对象有它。但我不确定。 python\cpython 如何检查对象是非类还是类,并在属性访问期间相应地将正确的参数传递给对象的描述符属性?

============================================

更新:

我正在学习 __getattribute__ 和描述符如何协同工作以创建有界方法。我想知道类对象和非类对象如何以不同方式调用描述符的 __get__ 。我认为这两种类型的对象共享相同的 __getattribute__ CPython 函数,并且该函数必须知道调用对象是类还是非类。但是我错了。这篇文章解释得很好:

http://docs.python.org/dev/howto/descriptor.html#functions-and-methods

所以类对象使用type.__getattribute__ 而非类对象使用object.__getattribute__。它们是不同的 CPython 函数。 super 还有第三个 __getattribute__ CPython 实现。

然而,关于 super ,上面的文章指出:报价与报价


super() 返回的对象还有一个自定义的 _getattribute_() 方法来调用描述符。调用 super(B, obj).m() 在 obj._class_._mro_ 中搜索紧跟在 B 之后的基类 A,然后返回 A._ dict_['m']._get_(obj, A)。如果不是描述符,则返回 m 不变。如果不在字典中,m 将恢复为使用 object._getattribute_() 的搜索。


上面的说法似乎不符合我用Python3.1的实验。我看到的是,这对我来说是合理的:

super(B, obj).m ---> A.__dict__['m'].__get__(obj, type(obj))

对象类 = 类型(对象)

super(B, objclass).m ---> A.__dict__['m'].__get__(None, objclass)

A 从未传递给 __get__

这对我来说是合理的,因为我相信 objclass(而不是 A)的 mro 链是 m 中需要的链,尤其是对于第二种情况。

我做错了什么吗?还是我没有理解正确?

最佳答案

正如评论者所问:你为什么关心?通常这表明没有按照预期的方式使用 Python。

Python 的一个非常强大的概念是duck typing .您不关心对象的类型或类,只要它公开了您需要的属性即可。

关于python - 如何从类对象中区分python非类对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5177100/

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