簡體   English   中英

如何在子類中使用描述符的裝飾器

[英]How to use a decorator of a descriptor within a sub class

我想知道是否可以在子類中使用描述符的裝飾器。

class Descriptor():
    def __get__(self, instance_obj, objtype):
        raise Exception('ouch.')
    def decorate(self, f):
        print('decorate', f)
        return f

class A():
    my_attr = Descriptor()

class B():
    @my_attr.decorate
    def foo(self):
        print('hey, whatsup?')

# --> NameError: name 'my_attr' is not defined

當然,這不起作用,因為在B的類定義中未定義my_attr

接下來我嘗試了:

class B():
    @A.my_attr.decorate
    def foo(self):
        print('hey, whatsup?')

# --> Exception: ouch.

但是,這種方法調用描述符__get__方法(其中instance_obj參數為None ),因此觸發了測試異常。 要訪問裝飾器,可以檢查instance_obj None為返回描述符本身:

def __get__(self, instance_obj, objtype):
    if instance_obj is None:
        return self
    raise Exception('avoid this')
# --> decorate <function B.foo at 0x1021dd7b8>

有用! 但它是否合理或有沒有辦法在B的類定義中使用裝飾器?

您可以通過從類的__dict__映射中檢索原始對象來完全繞過描述符協議:

A.__dict__['my_attr'].decorate

或清潔,使用vars()

vars(A)['my_attr'].decorate

然而, @修飾語法不允許訂閱(您將得到與屬性訪問,並在年底的單一調用僅簡單表述),所以你必須提取詞典第一

_A_my_attr = vars(A)['my_attr']
@_A_my_attr.decorate
def foo(self):
    # ...

但是,除非必須捕獲對類的綁定,否則最好保護__get__的第一個參數為None ,如您所發現的那樣。 這正是property對象或函數的作用。

暫無
暫無

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

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