我有一大堆由Django項目/站點共享的Django應用程序庫。在每個項目/站點中,有一個選項可以定義一個混合進類內的混合類,這個混合類將被混合到一個庫內基類(許多模型的子類)中。Python裝飾器限制一個方法到一個特定的類?
對於這個例子,假設庫中的基類是PermalinkBase
,混合類是ProjectPermalinkBaseMixIn
。
由於PermalinkBase
的子類很多,因此ProjectPermalinkBaseMixIn
中定義的所有方法/性質都不會被PermalinkBase
的所有子類使用。
我想編寫一個裝飾器,可以應用於ProjectPermalinkBaseMixIn
中的方法/屬性,以便限制它們從非批准的類訪問時運行(或至少返回None
)。
下面是我現在做:
class ProjectPermalinkBaseMixIn(object):
"""
Project-specific Mix-In Class to `apps.base.models.PermalinkBase`
"""
def is_video_in_season(self, season):
# Ensure this only runs if it is being called from the video model
if self.__class__.__name__ != 'Video':
to_return = None
else:
videos_in_season = season.videos_in_this_season.all()
if self in list(videos_in_season):
to_return = True
else:
to_return False
return to_return
這是我想如何做到這一點:
class ProjectPermalinkBaseMixIn(object):
"""
Project-specific Mix-In Class to `apps.base.models.PermalinkBase`
"""
@limit_to_model('Video')
def is_video_in_season(self, season):
videos_in_season = season.videos_in_this_season.all()
if self in list(videos_in_season):
to_return = True
else:
to_return = False
return to_return
這是可能的裝飾? This answer幫助我更好地理解裝飾器,但我無法弄清楚如何修改它來解決上面列出的問題。
裝修工是否適合這份工作?如果是這樣,我將如何編寫裝飾器功能limit_to_model
?如果不是,解決這個問題最好的辦法是什麼?
爲什麼你想做的事這個?! – ThiefMaster
我認爲你已經大量過度複雜的設計。只適用於某些類別的混音不是混音。只需創建一個抽象基類,然後在類中定義該功能即可。 (假定它是共享功能,在這種情況下,它看起來只需要是給定類中的函數)。 –
另外,Yoda的邏輯是什麼?你檢查它是不是真的,然後在'else'情況下做你想要的。 –