如何在python中更改对象的方法
我编写了一个python文件,如下所示:如何在python中更改对象的方法,python,Python,我编写了一个python文件,如下所示: class A(object): def update(self, str): pass def say(self, str): print "I update: " + str def fun(obj, str): obj.say(str) a = A() import types setattr(A, "update", types.MethodType(fun, None, A)) a.
class A(object):
def update(self, str):
pass
def say(self, str):
print "I update: " + str
def fun(obj, str):
obj.say(str)
a = A()
import types
setattr(A, "update", types.MethodType(fun, None, A))
a.update("hello")
b = A()
b.update("world?")
它改变了类的行为,对象b也改变了。但是,我只想更改对象a。
如何在python中更改对象的方法?以下是一种方法:
a.update = lambda x: fun(a, x)
以下是一种方法:
a.update = lambda x: fun(a, x)
您正在设置类方法,而只想设置绑定到某个实例的方法
>>> class MyClass(object):
... def a(self): pass
...
>>> MyClass.a = lambda x: x
>>> MyClass.a
<unbound method MyClass.<lambda>>
>>> a = MyClass()
>>> a.a
<bound method MyClass.<lambda> of <__main__.MyClass object at 0x1d7fed0>>
更改实例的
a
方法不会更改类或其他实例的方法。您正在设置类方法,而只希望设置绑定到某个实例的方法
>>> class MyClass(object):
... def a(self): pass
...
>>> MyClass.a = lambda x: x
>>> MyClass.a
<unbound method MyClass.<lambda>>
>>> a = MyClass()
>>> a.a
<bound method MyClass.<lambda> of <__main__.MyClass object at 0x1d7fed0>>
>>> class MyClass(object):
... def a(self): pass
...
>>> b = MyClass()
>>> b.a = lambda x: x
>>> MyClass.a
<unbound method MyClass.a>
>>> b.a
<function <lambda> at 0x1d88938>
>>> c = MyClass()
>>> c.a
<bound method MyClass.a of <__main__.MyClass object at 0x1d8d110>>
更改实例的
a
方法不会更改类或其他实例的方法。另一方面,应避免对内置类型使用变量名。str是内置类型。请注意,您应该避免为内置类型使用变量名。str是一个内置类型。嗨,Aapo Kyrola,如果我有两个对象a和b,我将a和b都设为fun。如果我有两个对象a和b,那么它们都有相同的更新行为,Aapo Kyrola,并且我将a和b都设置为fun。它们都有相同的更新行为
>>> class MyClass(object):
... def a(self): pass
...
>>> b = MyClass()
>>> b.a = lambda x: x
>>> MyClass.a
<unbound method MyClass.a>
>>> b.a
<function <lambda> at 0x1d88938>
>>> c = MyClass()
>>> c.a
<bound method MyClass.a of <__main__.MyClass object at 0x1d8d110>>