我们说我有这堂课:
class Dumb:
def __init__(self):
self.x = "beautiful attribute"
def do_something(self):
print("awesome method")
我知道我可以使用x
获取属性getattr(obj,"x")
的值,我知道我可以使用method.__self__
从方法获取对象的引用,就像这样:
duh = Dumb()
getattr(duh,"x")
object = duh.do_something.__self__
getattr(object,"x")
我使用repl.it向朋友展示了一些片段。它很方便,因为它在浏览器中执行脚本,但我无法使用pdb
进行调试。所以,当我执行其中一个方法时,我想我可以使用装饰器获取有关对象属性的一些信息:
def info(attribute):
def wrap_gen(func):
def wrapper(*args,**kwargs)
object = func.__self__
value = getattr(object,attribute)
func(*args,**kwargs)
print("The attribute %s is %s"%(attribute,value))
return wrapper
return wrap_gen
然后用它来装饰do_something
中的Dumb
。但是,它没有用,因为它引发了例外:
AttributeError: 'function' object has no attribute '__self__'
如果我理解正确的话,那是因为当装饰器...装饰方法时,没有Dumb
的延迟(根本没有类),因此,方法没有#&# 39;没有任何提及。
我怎样才能完成这样的任务?一个可能的解决方法是编写并测试我的计算机上的代码片段(这样我可以正确调试它),然后复制并粘贴代码片段,但它有点麻烦。
编辑: 我终于找到了我想要的东西,它比我尝试的更简单:
Python decorator accessing class arguments
基本上,我必须明确地将self
作为参数传递给函数的包装器,然后将其用作参考:
def info(attribute):
def wrap_gen(func):
def wrapper(self,*args,**kwargs)
value = getattr(self,attribute)
func(self,*args,**kwargs)
print("The attribute %s is %s"%(attribute,value))
return wrapper
return wrap_gen