动态绑定方法 MethodType()

动态绑定方法 MethodType()

在动态语言中,有一种方法可以使类或者实例在没有方法或者没有想要的方法时,动态的加上一个方法。使用的就是 MethodType()

其使用方法是:

form types import MethodType
需要绑定的类或实例.需要被绑定的方法=MethodType(方法名,类名/属性名)

1.绑定方法到实例中

class Student (object):              #先建立一个类
    pass
def set_age(self,age):               #一个即将被绑定的方法
    self.age=age
s=Student()                          #创建一个实例
from types import MethodType
s.set_age=MethodType(set_age,s)    
s.set_age=22
print(s.set_age)                   #输出22
s.set_age=MethodType(set_age,s)
s.set_age(23)
print(s.age)                      #输出23

2.绑定到类上

class Student (object):              #先建立一个类
    pass
def set_age(self,age):               #一个即将被绑定的方法
    self.age=age
from types import MethodType
Student.set_age=MethodType(set_age,Student)    
Student.set_age=22
print(Student.set_age)                   #输出22
Student.set_age=MethodType(set_age,Student)
Student.set_age(23)
print(Student.age)                      #输出23
s1=Student()
s1.age                                  #输出23

限制方法:__slots__

class Student(object):
    __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'

由于'score'没有被放到__slots__中,所以不能绑定score属性,试图绑定score将得到AttributeError的错误。

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的:

>>> class GraduateStudent(Student):
...     pass
...
>>> g = GraduateStudent()
>>> g.score = 9999

除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__

部分例子参考廖雪峰Python教程:链接:

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143186739713011a09b63dcbd42cc87f907a778b3ac73000

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值