2011-03-03 54 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。只要暴露了您需要的屬性,您就不會關心對象的類型或類別。