我对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的实例,但只有在调用该函数时才可用。
答案 0 :(得分:3)
无法从类装饰器中的函数读取它,因为在编译类时,“方法”仍然是正常函数。此外,在编译时尚未定义类名。
您可以做的是向装饰者提供my_var
列表。
class MyClass:
my_var = []
@my_decorator(my_var, 'sometext')
def my_func()
# do some super cool thing
到那时, my_var
仍然是一个正常的变量。