2011-03-03 95 views
2

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

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

已更新:

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

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

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

然而,关于超级一个,上面的文章指出: 报价及报价


由超级返回的对象()还具有自定义_ 的getAttribute _()方法用于调用描述符。超级呼叫(B,obj).m()搜索obj._ 类别 _._ mro _对于紧跟在B之后的基类A,然后返回A._ 字典 _ ['m']。 _ 得到 _(obj,A)。如果不是描述符,则m不变。如果不在字典中,则m恢复为使用对象进行搜索。_ 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)

一个从未传递到__get__

这是合理的因为我相信objclass(而不是A)的mro链是m中特别需要的第二种情况。

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

+0

我不清楚你在问什么。也许一个例子是为了? – 2011-03-03 05:45:33

+0

为什么你需要关心这个? – 2011-03-03 06:02:46

+0

借调。关注这一点违背了Python开发的一个东西。 – rossipedia 2011-03-03 06:47:25

回答

1

正如评论者问:你为什么想知道?通常情况下,这是没有像使用Python那样使用Python的一个标志。

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