Discuss / Python / 个人实验

个人实验

Topic source

先上代码


In [2]: from types import MethodType

In [3]: class Somebody():
   ...:     pass
   ...:

In [4]: def setage(self,age):
   ...:     self.age=age
   ...:

In [5]: def setscore(self,score):
   ...:     self.score=score
   ...:

In [6]: Somebody.setage=setage

In [7]: bob = Somebody()

In [8]: bob.setage(55)

In [10]: bob.age
Out[10]: 55

In [11]: Somebody.setage(55)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-11-3b70de52f1c4> in <module>()
----> 1 Somebody.setage(55)

TypeError: setage() missing 1 required positional argument: 'age'


In [12]: bob.setscore=setscore

In [13]: bob.setscore(65)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-13-47b717ecb4c7> in <module>()
----> 1 bob.setscore(65)

TypeError: setscore() missing 1 required positional argument: 'score'

通过前者方式绑定方法只能给类绑定,不能给实例绑定,而且绑定的方法类不能使用,只能实例化后使用;并且实例不能用第一种方式绑定方法。

而另外使用MethodType就可以随意绑定

In [14]: class Someone():
    ...:     pass
    ...:

In [15]: Someone.setage=MethodType(setage,Someone)

In [16]: Someone.setage(66)

In [17]: Someone.age
Out[17]: 66

In [18]: kay = Someone()

In [19]: kay.setscore=MethodType(setscore,kay)

In [20]: kay.setscore(34)

In [21]: kay.score
Out[21]: 34

请大神拍砖


  • 1

Reply