簡體   English   中英

在抽象 class 中編寫 python 裝飾器,並在繼承的 class 中使用它

[英]write a python decorator inside an abstract class and use it in an inherited class

TL;DR:我想在抽象的 class 中運行一些邏輯(例如更新數據庫)。 也許還有另一種方法可以做到這一點,這就是我到目前為止所能想到的(使用裝飾器)

##################################

我有以下抽象 class:

class MyAbstractClass(metaclass=abc.ABCMeta):

    @abc.abstractmethod
    def my_abstract_method(self, request):
        pass

    @staticmethod
    def decorator_func(self, func):
        def run_func(param_one, param_two):
            print('INSIDE run_func', param_one, param_two)
            results = self.update_database(param_one, param_two)
            func(test_id, request)
            print('FINISHED run_func')

        return run_func

    def update_database(self, param_one, param_two):
        results = <DO SOME BACKEND CALCULATIONS>
        return results

我想創建一個繼承自此 class 的子 class,並使用decorator_func在抽象方法my_abstract_method中進行一些數據庫更新:

class ChildClass(MyAbstractClass):
    def __init__(self):
        super().__init__()

    @MyAbstractClass.decorator_func
    def my_abstract_method(self, request):
        get_data()

所以我知道my_abstract_method將獲得更新的數據,因為裝飾器確保之前運行update_database

我嘗試了很多組合(例如刪除@staticmethod 或嘗試使用@classmethod 應用它),但它不起作用。 對於當前代碼,我得到錯誤: run_func() takes 2 positional arguments but 3 were given

關於如何在my_abstract_method運行之前輕松運行update_database的任何想法?

static 方法得到一個參數,function 被修飾。 返回的 function 是需要一個參數來保存方法調用接收到的隱式實例參數的那個。

@staticmethod
def decorator_func(func):
    def run_func(self, param_one, param_two):
        print('INSIDE run_func', param_one, param_two)
        results = self.update_database(param_one, param_two)
        func(self, test_id, request)
        print('FINISHED run_func')

    return run_func

因為func是對function的引用,而不是綁定方法,所以您需要將self作為第一個參數顯式傳遞。

暫無
暫無

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

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