Python动态绑定属性和方法
當(dāng)我們定義了一個(gè) class,創(chuàng)建了一個(gè) class 的實(shí)例后,我們可以給該實(shí)例綁定任何屬性和方法,也可以給類綁定任何屬性和方法,這就是動(dòng)態(tài)語言的靈活性。
給實(shí)例綁定屬性和方法,每個(gè)實(shí)例之間新增的部分是互不干擾的。
1. 先來看一個(gè)方法:MethodType
如果我們在模塊中定義一個(gè)方法,而不是在類中定義一個(gè)方法,那么此時(shí)這個(gè)方法并不是對象的實(shí)例方法,但是我們可以將這個(gè)方法作為屬性賦值給對象的
某一個(gè)屬性。比如下面這樣:
class Student(object):def __init___(self, name, age):self.name = nameself.age = age# 需要被綁定的方法 def run(self):print("this is run method ", self)stu = Student() stu.run = run stu.run("xxxxxx") # this is run method xxxxxx當(dāng)我們定義一個(gè) class 的時(shí)候可以給這個(gè)類定義實(shí)例屬性和實(shí)例方法,實(shí)例方法的特點(diǎn):當(dāng)實(shí)例方法被調(diào)用的時(shí)候Python對象會自動(dòng)作為self參數(shù)傳入
到方法的內(nèi)部。但是在調(diào)用 run 方法的時(shí)候 stu 對象不會作為 self 參數(shù)傳遞到 run 方法內(nèi)部,就好像是 staticmethod 方法一樣。MethodType 可以解決
這個(gè)問題,這個(gè)方法可以讓一個(gè)模塊方法在被調(diào)用的時(shí)候自動(dòng)傳入調(diào)用對象作為 self 參數(shù)。語法如下:
anotherRef = types.MethodType(methodName, instance/className)于是上面的代碼可以這樣改:
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' from types import MethodTypeclass Student(object):def __init___(self, name, age):self.name = nameself.age = age# 需要被綁定的方法 def run(self):print("this is run method ", self)stu = Student() stu.run = MethodType(run, stu) stu.run() # this is run method <__main__.Student object at 0x000001B453CEF370>2. 下面我們來介紹下如何動(dòng)態(tài)綁定
1) 綁定方法到實(shí)例中
from types import MethodTypeclass Student(object):passdef set_age(self, age):self.age = agestu1 = Student() stu2 = Student()stu1.set_age = MethodType(set_age, stu1) stu2.set_age = MethodType(set_age, stu2) stu1.set_age(22) stu2.set_age(44) print(stu1.age) # 22 print(stu2.age) # 442)綁定方法到類上
用 MethodType 將方法綁定到類,并不是將這個(gè)方法直接寫到類內(nèi)部,而是在內(nèi)存中創(chuàng)建一個(gè)link指向外部的方法,在創(chuàng)建實(shí)例的時(shí)候這個(gè)link也會被復(fù)制。
''' 遇到問題沒人解答?小編創(chuàng)建了一個(gè)Python學(xué)習(xí)交流QQ群:778463939 尋找有志同道合的小伙伴,互幫互助,群里還有不錯(cuò)的視頻學(xué)習(xí)教程和PDF電子書! ''' from types import MethodTypeclass Student (object):passdef set_age(self, age):self.age = ageStudent.set_age = MethodType(set_age, Student) stu1 = Student() stu2 = Student()stu1.set_age(23) stu2.set_age(99) print(stu1.age) # 99 print(stu2.age) # 99 print(id(stu1.set_age), id(stu2.set_age)) # 3022011453632 3022011453632 print(id(stu1.age), id(stu2.age)) # 140718085415648 140718085415648為什么 stu1,stu2 都顯示的 99 呢?,因?yàn)?stu1 和 stu2 都指向了相同的 set_age 和 age 地址。
總結(jié)
以上是生活随笔為你收集整理的Python动态绑定属性和方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python的一些特殊用法总结
- 下一篇: Python 逻辑运算符