我有一些python對象,其中有些方法需要在開始時進行一些檢查,具體取決於此檢查,方法的代碼將運行或執行會被提出。我不是在每個方法的開頭都複製「check」代碼,而是在做一個裝飾器,但我也希望裝飾器被嵌入到類本身內部,因爲它與它密切相關。所以基本上:在基類和派生類中使用基類的裝飾器
,而不是這個
class A(object):
def a_method(self):
if self.check_var is True:
(some_code)
else:
raise Exception
我想有這個
class A(object):
def decorator(function):
def function_wrapper(self, *args, **kwargs):
if self.check_var is True:
return function(self, *args, **kwargs)
else:
raise Exception
return function_wrapper
@decorator
def a_method(self):
(some_code)
我的第一個問題是,我要對這個權利?或者,還有更好的方法。我有許多需要進行此檢查的A類方法,所以這就是爲什麼我不想不必要地複製代碼的原因。
我的第二個問題是,如果按照我描述的方式進行操作,當我想從A類派生類並執行相同的裝飾器檢查時遇到問題。再次我不想複製代碼,所以我想重用基類A中的裝飾器來執行派生類中的檢查。我讀過關於將裝飾器轉換爲@classmethod
然而,當我這樣做時,我可以在派生類中使用裝飾器,但不能在基類中使用裝飾器!
所以基本上我想是這樣的:
class A(object):
@classmethod #maybe
def decorator(function):
def function_wrapper(self, *args, **kwargs):
if self.check_var is True:
return function(self, *args, **kwargs)
else:
raise Exception
return function_wrapper
@decorator
def a_method(self):
(some_code)
class B(A):
@decorator
def b_method(self):
(some_code)
有誰知道任何干淨的方式做到這一點?
只需在兩個類之外和之前定義'decorator()'。 – martineau
我想在課堂內有裝飾器...裝飾做的東西是對類 – viterbi
把你的基類的文件(模塊)與裝飾非常相關的,這種方式是很明顯的,他們屬於一個整體,然後就做什麼@martineau說 – user3012759