python-使用装饰器从类外部动态添加方法

我遇到两件事.从外部添加引用self的方法.即

class A(object):
  def __init__(self, name): 
    self.name=name

def my_name_is(self):
  print("my name is %s" %(self.name))

setattr(A, my_name_is.__name__, classmethod(my_name_is))
a = A('bob')
a.my_name_is() 

因为它试图引用“ A”而不是“ a”的名称属性.

另一个是使用装饰器添加该函数,例如

@addMethod(A)
def say_hello_to(x):
  print("hello %s" %x)

相当相当于

def addMethod(cls, f) 
  setattr(cls, f.__name__, classmethod(f))

解决方法:

问题1:您要寻找的是方法,而不是类方法.在这种情况下,一个简单的分配将起作用:

A.my_name_is = my_name_is

问题2:@后面的表达式应返回可调用对象,即addMethod(A)
 应该是可调用的.可以这样完成:

def addMethod(cls):
  def method_assigner(f):
     setattr(cls, f.__name__, f)
     return f
  return method_assigner

然后工作:

@addMethod(A)
def say_hello_to(x):
  print("hello %s" %x)

(在此示例中,当调用say_hello_to时,x将获得self的值.我不确定我是否确切了解x在您的cas中的作用,但希望这可以清楚说明如何实现您想要的功能.也许您想要def say_hello_to(self,x):…?).

上一篇:javascript-如何装饰Express中的应用程序方法?


下一篇:WPF 获取鼠标屏幕位置、窗口位置、控件位置