【python】動態綁定屬性和方法MethodType及限制動態綁定__slots__

一。動態綁定方法

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章