gpt4 book ai didi

类中的 Python 装饰器

转载 作者:IT老高 更新时间:2023-10-28 21:04:56 25 4
gpt4 key购买 nike

可以这样写吗:

class Test(object):
def _decorator(self, foo):
foo()

@self._decorator
def bar(self):
pass

这失败了:@self 中的 self 是未知的

我也试过了:

@Test._decorator(self)

同样失败:测试未知

我想临时更改一些实例变量在装饰器中,然后运行装饰方法,之前把它们改回来。

最佳答案

这样的东西能满足你的需要吗?

class Test(object):
def _decorator(foo):
def magic( self ) :
print "start magic"
foo( self )
print "end magic"
return magic

@_decorator
def bar( self ) :
print "normal call"

test = Test()

test.bar()

这避免了调用 self 来访问装饰器,并将其作为常规方法隐藏在类命名空间中。

>>> import stackoverflow
>>> test = stackoverflow.Test()
>>> test.bar()
start magic
normal call
end magic
>>>

已编辑以在评论中回答问题:

如何在另一个类中使用隐藏的装饰器

class Test(object):
def _decorator(foo):
def magic( self ) :
print "start magic"
foo( self )
print "end magic"
return magic

@_decorator
def bar( self ) :
print "normal call"

_decorator = staticmethod( _decorator )

class TestB( Test ):
@Test._decorator
def bar( self ):
print "override bar in"
super( TestB, self ).bar()
print "override bar out"

print "Normal:"
test = Test()
test.bar()
print

print "Inherited:"
b = TestB()
b.bar()
print

输出:

Normal:
start magic
normal call
end magic

Inherited:
start magic
override bar in
start magic
normal call
end magic
override bar out
end magic

关于类中的 Python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com