python - 类定义中的自引用

标签 python class decorator python-decorators class-members

如何在类定义中引用类对象?你能告诉我你会怎么做吗?或者更具体地说,你如何在类方法的装饰器中传递类对象? 这是一个简单的例子,我试图将我声明的第二个方法传递给第一个方法的装饰器。

def decorate(w):
    def _wrap(f):
        def _call(*args, **kwargs):
            return w(f(*args, **kwargs))
        def _call
    return _wrap

class A():

    @dec(A.w)
    def f():
        return 2

    def w(f):
        return fr + 5 

如预期的那样引发了异常

NameError: name 'A' is not defined

作为我调查的结果,我了解到当我在 decorate_wrap 函数,但在 _call 中定义。所以我可能可以通过字符串名称找到传递的方法(例如 @dec('A.w')),但在那种情况下,不可能在 _wrap 中缓存方法搜索关闭。

那么你如何解决这个问题? :)

最佳答案

你不能,因为在类定义期间,类还不存在

您可以在创建类后应用装饰器:

class A():
    def f(self):
        return 2

    def w(self, f):
        return fr + 5 

A.f = dec(A.w)(A.f.__func__)

或者你可以交换两个方法定义的顺序,并仍然将 w 作为本地名称引用:

class A():
    def w(self, f):
        return fr + 5 

    @dec(w)
    def f(self):
        return 2

在这两种情况下,您都传递了一个绑定(bind)到实例的可调用A.w。不会传入 self,因此您需要在装饰器中自己添加:

def decorate(w):
    def _wrap(f):
        def _call(self, *args, **kwargs):
            return w(self, f(*args, **kwargs))
        def _call
    return _wrap

如果您不希望 w 绑定(bind)(它充当静态方法),您可以在这里使用普通函数。

一般来说,在同一个实例上创建一个装饰器来调用另一个方法是没有意义的;为什么不直接从 f 中调用 w直接

class A():
    def f(self):
        return self.w(2)

    def w(self, f):
        return fr + 5 

关于python - 类定义中的自引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035153/

相关文章:

python - 使用 flask-ask 和 ngrok 的 Alexa 技能开发

ios - Swift:协议(protocol) vs. 结构 vs. 类

c# - 装饰器模式和 C#

python - 装修装饰师 : try to get my head around understanding it

python - 可以与包装函数的参数交互的装饰器

python - 调用 sys.exit() 后不触发 atexit

python - PyQt5 从另一种形式调用一种形式

c++ - 奇怪的运算符重载, "operator T& () const noexcept { return *_ptr; }"

Python GTK : Instantiating a subclass of gtk. Bin

java.lang.ClassCastException : java. util.Vector 无法转换为我的类