2

我是 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 one,上面的文章说:quote andquote


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


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

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

objclass = 类型(obj)

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

A从未传递给__get__

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

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

4

2 回答 2

1

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

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

于 2011-03-03T09:21:56.373 回答
0

inspect.isclass(objectname) 怎么样?

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

于 2011-03-03T09:12:57.837 回答