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