使用装饰器获取实例的属性

时间:2017-09-04 09:26:17

标签: python-3.x attributes decorator

我们说我有这堂课:

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

0 个答案:

没有答案