• 类方法:类内部定义的方法
  • 外部方法:定义在类外的方法,但是带上了self参数。

居于动态语言的灵活性,我们知道可以动态的给实例绑定属性,那是否可以给实例绑定一个方法,成为实例方法。
例如:

class Student(object):
      pass
>>>s = Student()
>>>s.name = 'xlp'          # 动态语言的灵活性:动态给实例绑定一个属性
def set_age(self,age)         # 定义一个外部方法:set_age(),不是class里的
self.age = age

可以创建一个链接把外部的set_age()方法链接到Student内。
具体做法是:通过MethodType给类一个实例绑定外部方法。

from types import MethodType   # ##????
s.set_age = MethodType (set_age,s)  # 给实例绑定一个方法
s.set_age(24)   # 调用实例方法
s.age   #测试结果
24

但是该方法对除开实例s,对其他实例是不起作用的。
例如:

s2 = Student()   # 创建新的实例
s2.set_age(25)   # 尝试调用该方法
# 报错
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#AttributeError: 'Student' object has no attribute 'set_age'

若要给类的所有实例绑定外部方法,则需要给类动态绑定该方法。

>>>def set_score(self,score):
     self.score = score 
>>>Student.set_score = set_score    # 直接用类来创建一个方法
>>> s.set_score(100)
>>> s.score
100
>>> s2.set_score(59)
>>> s2.score
59

此时实例和类都指向同一个set_score()。

通常,上面的set_score()方法一般直接定义在class中,但动态绑定允许我们在程序运行的过程中动态地给class加上功能。


❤ thanks for watching, keep on updating...
点个赞再走吧


unpredictable_X
34 声望17 粉丝

热爱学习,热爱生活