【发布时间】:2019-08-07 00:05:35
【问题描述】:
假设我有这个课程:
class Foo:
@classmethod
def some_decorator(cls, ...):
...
然后我创建一个使用父类装饰器的子类:
class Bar(Foo):
@Foo.some_decorator(...)
def some_function(...)
...
如何去掉装饰器名称前的Foo.?以下代码不起作用:
class Bar(Foo):
@some_decorator(...)
def some_function(...)
...
我相信这是可能的,因为 sly 库可以做到这一点。
看看他们的例子:
from sly import Lexer, Parser
class CalcLexer(Lexer):
...
@_(r'\d+')
def NUMBER(self, t):
t.value = int(t.value)
return t
...
如您所见,您可以输入@_(...) 而不是@Lexer._(...)。
他们是如何做到这一点的?
【问题讨论】:
-
旁白:我不太喜欢这种设计选择。在类中神奇地产生一个装饰器会产生不明显、难以理解的代码。一个更清洁的解决方案是让用户使用
from sly import _导入_装饰器。三思而后行,是否要在代码库中包含它。 -
@Aran-Fey 在我看来,这也不是很好:你污染了全局命名空间,
_不能对每个类都意味着不同的东西。对于 sly,_对于每个基类都有不同的含义。 -
我对这个项目一无所知,但词法分析器和解析器是为速度而不是可读性而构建的。这就是为什么 Lex 和 YACC 对某些人来说如此困难的原因。
标签: python class inheritance decorator