[英]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.