Python 使用decorator向类动态添加方法

Python 使用decorator向类动态添加方法,python,methods,decorator,Python,Methods,Decorator,我会向类动态添加方法。。。函数名也将动态传递 我该怎么办?我试过这样做 def decor(*var): def onDecorator(aClass): class onInstance: def __init__(self,*args,**kargs): setter=var aClass.setter = self.flam self.wrapped = aClass(*args,**kar

我会向
动态添加方法。。。函数名也将动态传递

我该怎么办?我试过这样做

def decor(*var):
  def onDecorator(aClass):
    class onInstance:
        def __init__(self,*args,**kargs):
            setter=var
            aClass.setter = self.flam
            self.wrapped = aClass(*args,**kargs)

        def __getattr__(self,attr):
            return getattr(self.wrapped,attr)

        def __setattr__(self,attr,value):
            if attr == 'wrapped':
                self.__dict__[attr]=value
            else:
                setattr(self.wrapped,attr,value)

        def flam(self,*args):
            self.__setattr__('dimension',len(args[0]))

    return onInstance
return onDecorator
但如果我这样做:

print(aClass.__dict__)
我有

'setter': <bound method onInstance.flam of <__main__.onInstance object at 0x522270>>
我会呼吁:

D.name()
并且有了回来的
self.dimension
但是我事先不知道
名字

这是我的装饰师

def decorator(name):
    def wrapper(K):
        setattr(K, name, eval(name))
        return K
    return wrapper
这是一个示例方法

def myfunc(self):
    print "Istance class: ", self
这是一个装饰类

@decorator("myfunc")
class Klass:
    pass
我希望这是有用的,也是您需要的:)

如果要保存原始的init并向definit添加新值

def __init__(self):
    cls.c += 1  # +1 to CLS, not self!
    cls.__init__

这是一个简化的py3解决方案

class A(object):
    def a(self):
        print('a')

def add_b(cls):
    def b(self):
        print('b')

    setattr(cls, 'b', b)
    return cls

@add_b
class C(A):
    pass

C().b() # 'b'
现在您可以这样使用它:

class Foo:
    pass

@add_method(Foo)
def bar(self, parameter1):
    pass # Do something where self is a class instance

只需记住在要添加到类的函数中包含self参数。

显示希望用于将方法附加到类的代码示例。我不知道你怎么能有一个方法,你想附加,但没有任何类型的名称。我也不知道,如果类最初不是用该方法设计的,那么你希望该方法附加到类中有什么意义。几年后,但展示了一个好的简单解决方案:
class A(object):
    def a(self):
        print('a')

def add_b(cls):
    def b(self):
        print('b')

    setattr(cls, 'b', b)
    return cls

@add_b
class C(A):
    pass

C().b() # 'b'
def add_method(cls):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            return func(*args, **kwargs)

        setattr(cls, func.__name__, wrapper)
        return func
    return decorator
class Foo:
    pass

@add_method(Foo)
def bar(self, parameter1):
    pass # Do something where self is a class instance