Python:重写未知类

Python:重写未知类,python,decorator,overriding,Python,Decorator,Overriding,考虑这个例子: x = a.some_class_instance x.foo() 我想装饰x.foo() 类似于 @x.foo() def dec() print 'decorator' x.foo() 有什么办法可以这样做吗? 谢谢:)简单的方法是: x.foo = dec(x.foo) 另一种方法是扩展实例的类 x = a.some_class_instance class Extended(x.__class__): @dec def

考虑这个例子:

x = a.some_class_instance
x.foo()
我想装饰
x.foo()

类似于

@x.foo()
def dec()    
    print 'decorator'    
    x.foo()
有什么办法可以这样做吗?
谢谢:)

简单的方法是:

x.foo = dec(x.foo)
另一种方法是扩展实例的类

x = a.some_class_instance
class Extended(x.__class__):
    @dec
    def foo(...):
        ...
但是我看不出有什么好的理由这样做。

下面的代码

@decorator
def decoratee():
    pass
这仅仅是

def decoratee():
    pass
decoratee = decorator(decoratee)
装饰器只是将函数作为参数并返回一个新函数

您的示例代码将被编译,并且根据x.foo所做的操作,实际上可以无错误地运行。但我非常怀疑它能满足你的要求。我认为你想要的是以下几点:

def decorate(f):
    def decorated():
        print 'decorator'  
        f()
    return decorated
x.foo = decorate(x.foo)

我不明白在那个例子中,装饰()是如何被调用的?我该如何访问x的名称空间?@Tony Medeiros:My bad;
装饰
函数应返回对
装饰
的引用(已修复)。在本例中,
修饰的
无法访问x的命名空间,这是对的。但是它可以通过传递给
decoration
f
参数访问旧的
x.foo
,这就是您的示例所需的全部内容。如果您想要访问x的所有名称空间,那么必须将x作为参数传递给
decoration