我已经定义了一些方法。我希望一个类只是这些方法的集合。
def _a(self):
pass
def _b(self):
pass
@decorated()
class MyClass(object):
a = _a
b = _b
装饰者是由其他人编写的,它会立即对该类进行一些分析。
我想要的是将这些方法粘贴在类上,但是在装饰者发挥其魔力之前,他们需要在那里。
methods = { 'a': _a, 'b': _b }
@decorated(...)
class MyClass(object):
for name, impl in methods
# What goes here?
我该怎么做?我假设它是某种形式的setattr(),但是如何在我正在构建的类中获取目标?
目前的实验是:
def merged(method_dict):
def _impl(cls):
for name, impl in method_dict.iteritems():
setattr(cls, name, impl)
return cls
return _impl
@decorated(...)
@merged(methods)
class MyClass(object):
c = _c
pass
decorated
装饰器报告它看到了c
,但没有报告a
或b
答案 0 :(得分:1)
问题是,只要定义了类,就会立即进行修饰,因为您使用@
语法。一些替代方案将采用jonrsharpe和 Ashwini Chaudhary建议的方式。
此外,你可以做的另一种方法是将装饰器包装到你的自定义装置中,你将在那里做你的东西然后只用手工装饰所提供的装饰,如下所示:
def your_decorator(func):
# your stuff
return decorated(func)
@your_decorator
class MyClass():
# ...
答案 1 :(得分:0)
我选择了jonrsharpe在评论部分中建议的内容:您应该使用@
语法来装饰类,而不是在创建后立即修饰类,您应该手动修饰它算账:
class MyClass:
pass
def _method_to_add_later(self):
pass
MyClass.method_to_add_later = _method_to_add_later
MyClass = decorated(...)(MyClass)
答案 2 :(得分:-1)
例如,可能是对的
def decorator(fn):
def _fn(*args, **kwargs):
print "Decorator"
fn(*args, **kwargs)
return _fn
@decorator
class MyClass(object):
def __init__(self):
print "Init"
def _a():
print "a"
def _b():
print "b"
if __name__ == '__main__':
methods = { 'a': _a, 'b': _b }
my = decorator(MyClass())
for name in methods:
setattr(my, name, methods[name])
my.a()
my.b()
输出:
Decorator
Init
a
b