首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何区分python非类对象和类对象

如何区分python非类对象和类对象
EN

Stack Overflow用户
提问于 2011-03-03 05:42:16
回答 2查看 430关注 0票数 2

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

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

更新:

我正在学习__getattribute__和描述符是如何合作的,从而形成有界的方法。我想知道类对象和非类对象如何以不同的方式调用描述符的__get__。我认为这两种类型的对象共享相同的__getattribute__ CPython函数,而同一个函数必须知道调用对象是类还是非类。但我错了。本文对此作了很好的解释:

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

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

然而,关于超级 one,上面的文章指出:报价和报价

_getattribute_() ()返回的对象也有一个自定义的调用描述符的方法。调用obj._class_._mro_ (B,obj).m()在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))

objclass = type(obj)

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

A从未被传递给__get__

这对我来说是合理的,因为我认为objclass (而不是A)的mro链是m所需要的,特别是在第二种情况下。

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

EN

回答 2

Stack Overflow用户

发布于 2011-03-03 09:21:56

正如评论者所问的:你为什么在乎?通常,这是不像使用Python那样使用Python的标志。

Python的一个非常强大的概念是鸭子 打字。您不关心对象的类型或类,只要它公开所需的属性。

票数 1
EN

Stack Overflow用户

发布于 2011-03-03 09:12:57

Inspect.isclass(对象名)怎么样?

更多信息在这里:http://docs.python.org/library/inspect.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5177100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档