当我们定义了一个 class,创建了一个 class 的实例后,我们可以给该实例绑定任何属性和方法,也可以给类绑定任何属性和方法,这就是动态语言的灵活性。

给实例绑定属性和方法,每个实例之间新增的部分是互不干扰的。

1. 先来看一个方法:MethodType

如果我们在模块中定义一个方法,而不是在类中定义一个方法,那么此时这个方法并不是对象的实例方法,但是我们可以将这个方法作为属性赋值给对象的

某一个属性。比如下面这样:

class Student(object):def __init___(self, name, age):self.name = nameself.age = age# 需要被绑定的方法
def run(self):print("this is run method ", self)stu = Student()
stu.run = run
stu.run("xxxxxx")   # this is run method  xxxxxx

当我们定义一个 class 的时候可以给这个类定义实例属性和实例方法,实例方法的特点:当实例方法被调用的时候Python对象会自动作为self参数传入

到方法的内部。但是在调用 run 方法的时候 stu 对象不会作为 self 参数传递到 run 方法内部,就好像是 staticmethod 方法一样。MethodType 可以解决

这个问题,这个方法可以让一个模块方法在被调用的时候自动传入调用对象作为 self 参数。语法如下:

anotherRef = types.MethodType(methodName, instance/className)

于是上面的代码可以这样改:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from types import MethodTypeclass Student(object):def __init___(self, name, age):self.name = nameself.age = age# 需要被绑定的方法
def run(self):print("this is run method ", self)stu = Student()
stu.run = MethodType(run, stu)
stu.run()   # this is run method  <__main__.Student object at 0x000001B453CEF370>

2. 下面我们来介绍下如何动态绑定

1) 绑定方法到实例中

from types import MethodTypeclass Student(object):passdef set_age(self, age):self.age = agestu1 = Student()
stu2 = Student()stu1.set_age = MethodType(set_age, stu1)
stu2.set_age = MethodType(set_age, stu2)
stu1.set_age(22)
stu2.set_age(44)
print(stu1.age)   # 22
print(stu2.age)   # 44

2)绑定方法到类上

用 MethodType 将方法绑定到类,并不是将这个方法直接写到类内部,而是在内存中创建一个link指向外部的方法,在创建实例的时候这个link也会被复制。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from types import MethodTypeclass Student (object):passdef set_age(self, age):self.age = ageStudent.set_age = MethodType(set_age, Student)
stu1 = Student()
stu2 = Student()stu1.set_age(23)
stu2.set_age(99)
print(stu1.age)   # 99
print(stu2.age)   # 99
print(id(stu1.set_age), id(stu2.set_age))   # 3022011453632 3022011453632
print(id(stu1.age), id(stu2.age))           # 140718085415648 140718085415648

为什么 stu1,stu2 都显示的 99 呢?,因为 stu1 和 stu2 都指向了相同的 set_age 和 age 地址。

Python动态绑定属性和方法相关推荐

  1. python入门--动态绑定属性和方法

    #动态绑定属性和方法 #Python是动态语言,在创建对象后,可以动态的绑定属性和方法 class Student:def __init__(self,name,age):#初始化方法self.nam ...

  2. Python设置属性值方法setattr()和判断变量是否存在的方法

    介绍Python设置属性值方法setattr()和判断变量是否存在的方法 1.以属性名为变量的方式给一个对象添加属性 使用 setattr 方法 obj = SomeClass() key = 'ke ...

  3. 一文搞懂 Python 私有属性 私有方法

    1. 场景定义 私有属性 是指在 Python 的面向对象开发过程中,对象的某些属性只想在对象的内部被使用,但不想在外部被访问到这些属性. 即:私有属性是对象不愿意公开的属性. 私有方法 是指在 Py ...

  4. python中属性与方法_python中属性和方法的动态绑定

    # 定义一个类class Student(object): pass # 实例化一个对象 s = Student() # 给这个对象绑定一个属性name s.name = 'John' print(s ...

  5. python request属性及方法说明

    if  request.REQUEST.has_key('键值'): HttpRequest对象的属性 参考: 表 H-1. HttpRequest对象的属性 属      性 描述 path 表示提 ...

  6. [转载] python复数类型-Python 复数属性和方法操作实例

    参考链接: Python中的复数1(简介) 复数是由一个实数和一个虚数组合构成,表示为:x+yj 一个复数时一对有序浮点数 (x,y),其中 x 是实数部分,y 是虚数部分. Python 语言中有关 ...

  7. Python 复数属性和方法操作实例

    复数是由一个实数和一个虚数组合构成,表示为:x+yj 一个复数时一对有序浮点数 (x,y),其中 x 是实数部分,y 是虚数部分. Python 语言中有关复数的概念: 1.虚数不能单独存在,它们总是 ...

  8. Python复数属性和方法操作实例

    无意中发现了一个很好的软件测试网站,忍不住分享一下给大家.觉得很实用,所以分享给大家.点这里可以跳转到教程. #coding=utf8 ''' 复数是由一个实数和一个虚数组合构成,表示为:x+yj 一 ...

  9. 彻底搞懂Python类属性和方法的调用

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 一.类.对象概述 在面向对象程序设计中,把数据以及对数据的操作封装在一起,组成一个整体(对象 ...

最新文章

  1. Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...
  2. C++ cin相关函数总结
  3. 安装完python后、还需要安装什么-安装python后
  4. 【转】请尊重测试:测试从业五年有感
  5. BQ27510 电量计的校准 的 C语言实现
  6. UA MATH564 概率论 QE练习题3
  7. 精灵沿着正方形路线运动暂停2秒后然后再将自己放大4倍
  8. FreeMarker生成word的代码
  9. 实训总结_实训总结汇报!
  10. aws中部署防火墙_如何在AWS中设置自动部署
  11. BIEE 目录迁移(文件夹)方式
  12. 联合国儿童基金会投资六家区块链初创企业,目标是解决“全球性挑战”
  13. MySQL安装时Download界面为空,不显示需要下载的组件,MySQL Installer 8.0.28.0 Download界面为空解决方案
  14. caj格式转pdf的3种方法
  15. 设计模式十八:mediator(中介者模式)——对象行为型模式
  16. 《机器人编程实战》一一1.2 给机器人指令
  17. 《Java就业培训教程》_张孝祥_书内源码_07
  18. Ubuntu系统配置Java环境
  19. 在Mac上安装SoapUI
  20. springboot做梦网云科技短信业务

热门文章

  1. linux 安装mysql两种方式
  2. 避免误删文件:Linux回收站机制
  3. 我学的是设计模式的视频教程——命令模式vs策略模式,唠嗑
  4. CentOS 6.4 Heartbeat+mysql+nfs实现高可用的mysql集群
  5. C#开发Android应用的必备——Mono for Android V1.0 发布
  6. JQuery学习系列(九)AJAX
  7. ★ 让你的虚机飞起来 ★
  8. mongodb 导出 带条件_将 MongoDB 导出成 csv
  9. 【转】MB51搜索字段的设置
  10. SAP推出SAP Digital Boardroom