python动态给对象或者类添加方法


参考:http://stackoverflow.com/questions/972/adding-a-method-to-an-existing-object

 

In Python, there is a difference between functions and bound methods.

>>>def foo():...print"foo"...>>>class A:...def bar( self ):...print"bar"...>>> a = A()>>> foo <function foo at 0x00A98D70>>>> a.bar <bound method A.bar of <__main__.A instance at 0x00A9BC88>>>>>

Bound methods have been "bound" (how descriptive) to an instance, and that instance will be passed as the first argument whenever the method is called.

Callables that are attributes of a class (as opposed to an instance) are still unbound, though, so you can modify the class definition whenever you want:

>>>def fooFighters( self ):...print"fooFighters"...>>> A.fooFighters = fooFighters >>> a2 = A()>>> a2.fooFighters <bound method A.fooFighters of <__main__.A instance at 0x00A9BEB8>>>>> a2.fooFighters() fooFighters

Previously defined instances are updated as well (as long as they haven't overridden the attribute themselves):

>>> a.fooFighters() fooFighters

The problem comes when you want to attach a method to a single instance:

>>>def barFighters( self ):...print"barFighters"...>>> a.barFighters = barFighters >>> a.barFighters()Traceback(most recent call last):File"<stdin>", line 1,in<module>TypeError: barFighters() takes exactly 1 argument (0 given)

The function is not automatically bound when it's attached directly to an instance:

>>> a.barFighters <function barFighters at 0x00A98EF0>

To bind it, we can use the MethodType function in the types module:

>>>import types >>> a.barFighters = types.MethodType( barFighters, a )>>> a.barFighters <bound method ?.barFighters of <__main__.A instance at 0x00A9BC88>>>>> a.barFighters() barFighters

This time other instances of the class have not been affected:

>>> a2.barFighters()Traceback(most recent call last):File"<stdin>", line 1,in<module>AttributeError: A instance has no attribute 'barFighters'

More information can be found by reading about descriptors and metaclass programming.

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM