我刚接触Python,还无法通过在线搜索找到该问题的答案。

这是一个不执行任何操作的示例装饰器(尚未)

def my_decorator(text):
  def wrap(f):
    # grab magic f.parent_class_object.my_var and append text
    def wrap_f(*args, **kwargs):
      f(*args, **kwargs)
    return wrap_f
  return wrap


这是一个示例类

class MyClass:
  my_var = []

  @my_decorator('sometext')
  def my_func()
    # do some super cool thing


在我的装饰器中,我想访问MyClass的类对象,并将“ sometext”添加到MyClass.my_var列表中。我的目标是在模块加载时而不是函数调用时用修饰后的值填充my_var。

有没有办法我可以从f导航到MyClass来做到这一点?我知道* args [0]是MyClass的实例,但是仅在调用函数时可用。

最佳答案

无法从类装饰器中的函数读取它,因为在编译类时“方法”仍然是正常函数。另外,类名在编译时尚未定义。

您可以做的是将my_var列表提供给装饰器。

class MyClass:
    my_var = []

    @my_decorator(my_var, 'sometext')
    def my_func()
        # do some super cool thing


到那时my_var仍然是普通变量。

10-04 20:59
查看更多