- 类方法:类内部定义的方法
- 外部方法:定义在类外的方法,但是带上了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...
点个赞再走吧
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。