为了账号安全,请及时绑定邮箱和手机立即绑定

是否允许在抽象类中使用用户定义的装饰器?或者,是否应该在继承后使用?

是否允许在抽象类中使用用户定义的装饰器?或者,是否应该在继承后使用?

绝地无双 2022-03-09 20:55:02
例如,假设我有一个我定义的装饰器,称为:decoratedef decorate(func):  def inside_func(*args, **kwargs):    # Do something    return func(*args, **kwargs)  return inside_func接下来,假设我正在编写一个名为 Model 的抽象类from abc import ABC, abstractmethodclass Model(ABC):  def __init__(self, value):      self.value = value      super().__init__()  @abstractmethod  @decorate # <-------------------- IS @decorate ALLOWED HERE?  def do_something(self):      pass或者,应该是:from abc import ABC, abstractmethodclass Model(ABC):  def __init__(self, value):    self.value = value    super().__init__()  @abstractmethod  def do_something(self):    pass# Inherit the base classclass DoAdd42(Model):   @decorate # <----------------------- SHOULD @decorate BE HERE INSTEAD?   def do_something(self):     return self.value + 42如果两者都被允许,是否有这样做的“最佳实践”方式?
查看完整描述

1 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

两者都允许。因为abstractmethod, yourdecorate和somethingin class 都是函数。您可以将它们打印到控制台以进行验证。


In [2]: def decorate(func):

   ...:   def inside_func(*args, **kwargs):

   ...:     # Do something

   ...:     return func(*args, **kwargs)

   ...:   return inside_func

   ...:

In [7]: from abc import ABC, abstractmethod

   ...:

   ...: class Model(ABC):

   ...:   def __init__(self, value):

   ...:       self.value = value

   ...:       super().__init__()

   ...:

   ...:   @abstractmethod

   ...:   @decorate # <-------------------- IS @decorate ALLOWED HERE?

   ...:   def do_something(self):

   ...:       pass

   ...:   # even no self is valid for class in Python3+

   ...:   def whatever():

   ...:       print('fff')

   ...:


In [8]: print(abstractmethod)

<function abstractmethod at 0x100ff86a8>


In [9]: print(Model.do_something)

<function decorate.<locals>.inside_func at 0x1041031e0>


In [10]: print(Model.whatever)

<function Model.whatever at 0x103b48950>


In [11]: Model.whatever()

fff

我不熟悉abstractmethod,所以我不知道最佳实践和有关它的规则的更多细节。你可以试着根据我给你的信息,结合你自己对abstractmethod.


查看完整回答
反对 回复 2022-03-09
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号