1. 程式人生 > >Python類和實例方法和屬性的動態綁定

Python類和實例方法和屬性的動態綁定

tuple attribute 名稱 one 運行 作用 span people tee

python中實例創建後可以給實例綁定任何屬性和方法

class  Student(object):
    pass

  給實例綁定一個屬性:

s=Student()
s.name=‘Michel‘
print s.name    #  Michel

  給實例綁定一個方法:

def  set_age(self,age):
    self.age=age
    
from  types  import  MethodType

s.set_age=MethodType(set_age,s,Student)
s.set_age(25)
print  s.age  #25

  給實例綁定的方法,對另一個實例是不起作用的,為了給所有的實例都綁定方法,可以給class綁定方法

給類綁定方法

def  set_score(self,score):
    self.score=score
    
Student.set_score=MethodType(set_score,None,Student)

s.set_score(100)
print  s.score  #100

s2=Student()
s2.set_score(89)
print s2.score   #89

  上面的set_score方法可以直接定義在class中,但動態綁定允許我們在程序運行的過程中動態給class加上功能

__slots__限制class能添加的的屬性

class People(object):
    __slots__=(‘name‘,‘age‘)  #用tuple定義允許綁定的屬性名稱
    
p=People()
p.name=‘Michel‘
p.age=23
p.score=99  #綁定屬性score

 由於score沒有放到__slots__中,所以不能綁定score屬性,此時會報錯:AttributeError: ‘People‘ object has no attribute ‘score‘

__slots__定義的屬性僅對當前的類起作用,對繼承的子類是不起作用的,除非在子類中也定義__slots__,這樣子類允許定義的屬性就是自身的加上父類的

class GraduateStudent(Student):
    pass

g=GraduateStudent()
g.score=99

  

Python類和實例方法和屬性的動態綁定