在类定义

时间:2015-10-08 20:40:08

标签: python python-2.7

我已经定义了一些方法。我希望一个类只是这些方法的集合。

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,但没有报告ab

3 个答案:

答案 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