如何解决获取类修饰函数的实例
我有一个类如下:
class A:
def __init__(self,x,y):
self.x = x
self.y = y
def __call__(self,func):
def wrapper():
print("decorated",self.x,self.y)
func()
return wrapper
现在如果我想用这个类来装饰函数:
@A(4,5)
def fn():
print("original function")
fn()
输出:
decorated 4 5
original function
问题:
-
既然在
@A(3,4)
中调用了__init__
类构造函数,那么创建的类A
实例去了哪里?有办法参考吗? -
如何在不调用
self.x,self.y
的情况下访问类外的属性fn()
? (我想要fn.x
或fn.y
之类的东西,但它们不起作用)
解决方法
您可以使用 __closure__
获取 cell
对象的元组。
在这种情况下,第一个元素是函数的单元格对象,第二个是类 A
的单元格对象。
您可以使用 f.__closure__[1]
访问它并使用 .cell_contents
获取对象。
class A:
def __init__(self,x,y):
self.x = x
self.y = y
def __call__(self,func):
def wrapper():
print("decorated",self.x,self.y)
func()
return wrapper
@A(1,2)
def f():
print('fun')
A_cell = f.__closure__[1]
A_obj = A_cell.cell_contents
print(A_obj.x,A_obj.y) # 1 2
回答您的问题
- 有没有办法引用类
A
的创建实例?是的,A_obj = f.__closure__[1].cell_contents
- 如何访问类外的属性
self.x
、self.y
?A_obj.x,A_obj.y
如果您使用的是 Python 3.8+,您可以使用 :=
并避免错误和单元格。
你可以这样装饰
@(a := A(1,2)) # this assigns the object to `a`
def f():
print('fun')
print(a is f.__closure__[1].cell_contents) # True
差不多就是这个
a=A(1,2)
@a
def f():
print('fun')
,
你可以直接在函数上设置属性,如果你愿意:
class A:
def __init__(self,self.y)
func()
wrapper.x = self.x
wrapper.y = self.y
wrapper.decorator = self
return wrapper
@A(4,5)
def fn():
pass
print(fn.x,fn.y,fn.decorator)
给出输出:
laurel% python3 ~/tmp/dec.py
4 5 <__main__.A object at 0x7f79ebb2cfd0>
laurel%
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。