【发布时间】:2017-03-24 12:57:48
【问题描述】:
我有一些带有一些方法的 python 对象,我想在开始时做一些检查,根据这个检查,方法的代码会运行,或者会引发一个执行。我不想在每个方法的开头复制“检查”代码,而是希望将装饰器嵌入到类本身中,因为它与它密切相关。所以基本上:
而不是这个
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所说的去做
-
另外,您可以跳过装饰器,而使用元类。更多的前期工作,但在子类中没有工作。
-
除了像@o11c 那样的元类,建议您可以使用 class 装饰器,它适用于基类和子类。这两种技术的一个可能问题是很难有选择地将装饰分配给类的任意一组方法。
标签: python python-decorators class-method