您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python – 成员函数装饰器和自我参数

5b51 2022/1/14 8:21:33 python 字数 3087 阅读 495 来源 www.jb51.cc/python

以下关于成员函数的装饰器的最小示例:def wrap_function(func): def wrapper(*args, **kwargs): print(args) print(kwargs) return wrapper class Foo: @wrap_function def mem

概述

以下关于成员函数的装饰器的最小示例:

def wrap_function(func):
    def wrapper(*args,**kwargs):
        print(args)
        print(kwargs)
    return wrapper

class Foo:
    @wrap_function
    def mem_fun(self,msg):
        pass

foo = Foo()
foo.mem_fun('hi')

输出

(<__main__.Foo object at 0x7fb294939898>,'hi')
{}

所以自我就是其中的一个.

但是在使用包装类时:

class WrappedFunction:
    def __init__(self,func):
        self._func = func

    def __call__(self,*args,**kwargs):
        print(args)
        print(kwargs)

def wrap_function(func):
    return WrappedFunction(func)

class Foo:
    @wrap_function
    def mem_fun(self,msg):
        pass

foo = Foo()
foo.mem_fun('hi')

输出是:

('hi',)
{}

因此,引用Foo对象的self不能在WrappedFunction对象的__call__体中访问.

我怎样才能在那里访问它?

您要么必须将调用包装到包装函数并将* args / ** kwargs传递给它,要么只是创建一个正确的包装类而不是添加中间包装器:

class WrappedFunction(object):

    def __call__(self,func):
        def wrapper(*args,**kwargs):
            print(args)
            print(kwargs)
            # NOTE: `WrappedFunction` instance is available in `self`
        return wrapper

class Foo:
    @WrappedFunction()  # wrap directly,without an intermediary
    def mem_fun(self,msg):
        pass

foo = Foo()
foo.mem_fun('hi')
# (<__main__.Foo object at 0x000001A2216CDBA8>,'hi')
# {}

总结

以上是编程之家为你收集整理的python – 成员函数装饰器和自我参数全部内容,希望文章能够帮你解决python – 成员函数装饰器和自我参数所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶