在抽象 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
在抽象方法 [=16= 中进行一些数据库更新]:
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 或尝试将其与@class 方法一起应用)但它不起作用。对于当前代码,我得到错误:run_func() takes 2 positional arguments but 3 were given
关于如何在 my_abstract_method
运行 之前轻松 运行 update_database
的任何想法?
静态方法得到一个参数,函数被修饰。 it returns 函数需要一个参数来保存方法调用接收到的隐式实例参数。
@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
是对 函数 的引用,而不是绑定方法,所以您需要将 self
作为第一个参数显式传递。
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
在抽象方法 [=16= 中进行一些数据库更新]:
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 或尝试将其与@class 方法一起应用)但它不起作用。对于当前代码,我得到错误:run_func() takes 2 positional arguments but 3 were given
关于如何在 my_abstract_method
运行 之前轻松 运行 update_database
的任何想法?
静态方法得到一个参数,函数被修饰。 it returns 函数需要一个参数来保存方法调用接收到的隐式实例参数。
@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
是对 函数 的引用,而不是绑定方法,所以您需要将 self
作为第一个参数显式传递。