簡體   English   中英

具有舊式類的Python描述符

[英]Python descriptors with old-style classes

我試圖谷歌一些關於它的東西。 為什么非數據描述符適用於舊式類?

文件說他們不應該:
請注意,僅對新樣式對象或類(子類object()type() )調用描述符。

class Descriptor(object):
    def __init__(self):
        self.x = 1

    def __get__(self, obj, cls=None):
        return self.x


class A:
    x = Descriptor()

a = A()
a.x

>>> 1

謝謝。

您對文檔提出質疑是正確的。 我試過通過CPython來源查找解釋,但要注意:我不是專家。

根據我的理解,屬性查找和描述符__get__調用發生在instance_getattr2 (選擇的提取)中:

v = class_lookup(inst->in_class, name, &klass);
if (v != NULL) {
    f = TP_DESCR_GET(v->ob_type);
    if (f != NULL) {
        PyObject *w = f(v, (PyObject *)inst, (PyObject *)(inst->in_class));
    }
}

所以要么我缺少一些東西,要么實現中沒有任何東西需要一個新式的對象(這與文檔相矛盾)。

為了記錄,我嘗試重新編譯Python以將描述符調用限制為新的樣式類對象,但它實際上帶來了巨大的混亂。 我在這個過程中了解到類方法本身是作為描述符實現的:這是用於根據用法返回綁定或未綁定方法對象的機制。 例如:

>>> class A:
...     def foo():
...         pass
...
>>> A.foo.__get__(None, A)
<unbound method A.foo>
>>> A.foo.__get__(A(), A)
<bound method A.foo of <__main__.A instance at 0x000000000229CC48>>

因此, 似乎防止對舊式對象或類的屬性進行描述符調用也會阻止對它們的方法調用 ,至少在CPython實現方面是這樣。

再一次,我不是專家,這是我第一次深入Python實現,所以我很可能是錯的。 我提出了一個問題 ,試圖澄清這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM