如何从类对象中告诉python非类对象

时间:2011-03-03 05:42:17

标签: python class attributes types descriptor

我是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()返回的对象还有一个用于调用描述符的自定义_ getattribute _()方法。调用super(B,obj).m()在紧跟在B之后的基类A中搜索obj ._ _._ mro _然后返回A._ dict _ ['m'] ._ get _(obj,A)。如果不是描述符,则返回m不变。如果不在字典中,则m将恢复为使用对象的搜索._ 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)

从未传递给__get__

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

我做错了吗?或者我没有正确理解它?

2 个答案:

答案 0 :(得分:1)

评论者问:你为什么关心?通常,这表示不按照使用方式使用Python。

一个非常强大的Python概念是duck typing。只要它暴露了您需要的属性,您就不关心对象的类型或类。

答案 1 :(得分:0)

inspect.isclass(objectname)怎么样?

此处有更多信息:http://docs.python.org/library/inspect.html