Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中更改对象的方法_Python - Fatal编程技术网

如何在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.

我编写了一个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.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>>