<p>TLDR(转至底部)</p>
<p>首先让我们提醒自己装饰师是做什么的</p>
<p>它们是可调用函数/函数,将函数作为输入并返回新函数(修饰)</p>
<p>这意味着我们可以装饰这样的功能</p>
<pre><code>def return_hello():
return "hello "
def multiply_by_5(func):
def new_func(*args,**kwargs):
return func(*args, **kwargs) * 5
multiply_by_5(return_hello)()
</code></pre>
<p>或者使用@语法</p>
<pre><code>@multiply_by_5
def return_hello():
return "hello "
return_hello()
</code></pre>
<p>因此,在您的示例中,您已经用</p>
<pre><code>@designation()
</code></pre>
<p>这是通过_call _方法模拟可调用的(请参见<a href="https://docs.python.org/3/reference/datamodel.html?highlight=__call__#object.__call__" rel="nofollow noreferrer">docs</a>)。这意味着_调用_方法被传递给函数(即_调用_方法实际上是这里的装饰器)</p>
<p>因此,您可以像这样修复代码:</p>
<pre><code>...
class designation():
def __call__(self, func):
def new_func(*n_args, **n_kwargs):
return "MR" + func(*n_args,**n_kwargs)
return new_func
@designation()
def full_name(self):
...
</code></pre>
<p>编辑2:你也可以像这样添加属性装饰器,它会工作的</p>
<pre><code>@property
@designation()
def full_name(self):
...
</code></pre>
<p>编辑3:您也可以通过一个简单的基于函数的装饰器来实现所有这些。所以,除非你真的需要你的装饰者成为一个类,否则我会推荐这个</p>
<pre><code>def designation(func):
def new_func(*args, **kwargs):
name = func(*args, **kwargs)
return "MR" + name
return new_func
</code></pre>