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
。