一。動態綁定方法
1.運行時給類動態綁定方法
from types import MethodType
class Person(object):
pass
def set_age(self,age):
self.age = age
def main():
p1 = Person()
p2 = Person()
Person.set_age = MethodType(set_age,Person) #動態綁定類
p1.set_age(11)
p2.set_age(22)
print(p1.age)
print(p2.age)
if __name__ == '__main__':
main()
#執行後結果,分析:該方法綁定的是Person類,所有實例指向該方法,共享該方法
#<<<22
#<<<22
2.針對上述問題,可以綁定實例
from types import MethodType
class Person(object):
pass
def set_age(self,age):
self.age = age
def main():
p1 = Person()
p2 = Person()
p1.set_age = MethodType(set_age,p1)
p2.set_age = MethodType(set_age,p2)
p1.set_age(11)
p2.set_age(22)
print(p1.age)
print(p2.age)
if __name__ == '__main__':
main()
#執行後結果,分析:該方法綁定的是各個實例,所有指向不同,各個不干涉
#<<<11
#<<<22
二。限制動態綁定屬性和方法
1.限制動態綁定方法
from types import MethodType
class Person(object):
__slots__ = ("name","age") # it's tuple
pass #限制綁定屬性或方法只能是name和age
def set_age(self,age):
self.age = age
def main():
p1 = Person()
p1.set_age = MethodType(set_age,p1)
p1.set_age(11)
print(p1.age)
if __name__ == '__main__':
main()
#執行報錯: 'Person' object has no attribute 'set_age'
#只有加上__slots__ = ("name","age","set_age")才能執行成功,動態綁定成功
2.限制綁定屬性
from types import MethodType
class Person(object):
__slots__ = ("name","age","set_age") # it's tuple
pass
def set_age(self,age):
self.age = age
def main():
p1 = Person()
p1.set_age = MethodType(set_age,p1)
p1.set_age(11)
print(p1.age)
p1.score=10 #執行時新增屬性score,就會報錯了
print(p1.score) #AttributeError: 'Person' object has no attribute 'score'
if __name__ == '__main__':
main()