【发布时间】:2012-04-11 23:09:02
【问题描述】:
通过将装饰器定义为类来装饰类的简单示例是什么?
我正在尝试使用 PEP 3129 实现 Python 2.6 中已实现的功能,除了使用类而不是函数,正如 Bruce Eckel 解释的 here。
以下作品:
class Decorator(object):
def __init__(self, arg):
self.arg = arg
def __call__(self, cls):
def wrappedClass(*args):
return cls(*args)
return type("TestClass", (cls,), dict(newMethod=self.newMethod, classattr=self.arg))
def newMethod(self, value):
return value * 2
@Decorator("decorated class")
class TestClass(object):
def __init__(self):
self.name = "TestClass"
print "init %s"%self.name
def TestMethodInTestClass(self):
print "test method in test class"
def newMethod(self, value):
return value * 3
除了,在上面,wrappedClass 不是一个类,而是一个被操作以返回类类型的函数。我想编写如下相同的可调用对象:
def __call__(self, cls):
class wrappedClass(cls):
def __init__(self):
... some code here ...
return wrappedClass
如何做到这一点?
我不完全确定 """...这里有一些代码..."""
【问题讨论】:
-
您是否尝试过您自己发布的代码?它应该可以工作。
-
使用该功能的第一部分确实有效。不过,我如何将 WrappedClass 写成真正的类?
-
你的装饰师应该做什么?在不知道这段代码应该做什么的情况下,我无法告诉你哪些代码必须进入“这里的一些代码”。
-
我想用一个类来实现一个函数可以实现的东西。我知道这可以做到,但找不到任何例子来说明这一点
-
我不明白。第二个 sn-p 中的代码应该可以正常工作。您可以将 any 代码放在“此处的某些代码”所在的位置。我现在应该如何知道这段代码应该做什么?如果您不想覆盖
__init__(),那就不要。如果你确实想覆盖它,你显然想以某种方式改变它的行为。我在问:以什么方式?