Python类和实例方法和属性的动态绑定

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

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值