【发布时间】:2011-11-23 15:51:36
【问题描述】:
我正在努力寻找减少样板装饰器的方法。我们有很多使用@decorate 的类。例如:
class MyClass(Base):
@decorate
def fun1(self):
pass
@decorate
def fun2(self):
pass
def fun3(self):
pass
我想这样做,所以默认情况下装饰器就在那里,除非有人另有说明。
我使用此代码进行自动换行
from functools import wraps
def myDecorator(func):
@wraps(func)
def decorator(self, *args, **kwargs):
try:
print 'enter'
ret = func(self, *args, **kwargs)
print 'leave'
except:
print 'exception'
ret = None
return ret
return decorator
class TestDecorateAllMeta(type):
def __new__(cls, name, bases, local):
for attr in local:
value = local[attr]
if callable(value):
local[attr] = myDecorator(value)
return type.__new__(cls, name, bases, local)
class TestClass(object):
__metaclass__ = TestDecorateAllMeta
def test_print2(self, val):
print val
def test_print(self, val):
print val
c = TestClass()
c.test_print1("print 1")
c.test_print2("print 2")
我的问题是:
- 有没有更好的方法来完成自动装饰?
- 如何进行覆盖?
理想情况下,我的最终解决方案是:
class TestClass(object):
__metaclass__ = TestDecorateAllMeta
def autowrap(self):
print("Auto wrap")
@dont_decorate
def test_dont_decorate(self, val):
print val
编辑
与下面的 cmet 之一交谈,因为 classess 是可调用的而不是做
if callable(value):
应该是:
if isinstance(value,types.FunctionType)
【问题讨论】:
-
显式优于隐式。除非有很多样板(每个方法有十几个重要的行),否则我会回避元类魔法。哎呀,即便如此,只要有可能,我还是更喜欢更简单的解决方案。
标签: python python-2.5