Python Dynamicly使用修饰符从类外部添加方法

Python Dynamicly使用修饰符从类外部添加方法,python,decorator,Python,Decorator,有两件事我遇到了麻烦。从外部添加引用self的方法。i、 e 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() 因为它试图

有两件事我遇到了麻烦。从外部添加引用self的方法。i、 e

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'的名称attr

另一个是添加带有装饰器的函数,例如

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

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

问题1:你要找的是一种方法,而不是
classmethod
。在这种情况下,一个简单的任务就可以了:

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)

(在本例中,
x
将在调用
say_hello_to
时获得
self
的值。我不确定自己是否完全理解
x
在cas中的作用,但希望这能清楚地说明如何实现您想要的。也许您希望
def say_hello_to(self,x):…
).

如果您想引用
self
,为什么要使用
classmethod
?请注意,
str.format()
%
格式更可取。您是否有一个指向帖子的链接或更多有关此内容的信息?(str.format vs%)我的意思是为什么str.format()被认为比%interpolation更可取是的,对(self,x)说“你好”是正确的。我如何定义它们,以便不必在原始函数声明中引用self,或者可能使用addMethod动态地添加self?分配给类的函数应该是一个围绕
f
的包装器,它接受
self
*a,**kw
并将
*a,**kw
传递给
f