一般类对象新增变量或方法的过程

在面向对象(OOP)的编程方法中,如果需要给实例化的类对象新增方法或者属性,一般都是在class类的定义中新增内容,然后才能用类对象来调用新增的方法或变量。如在C++中:

C++示例类

如果此时开发人员需要为类对象p新增一个变量age和一个方法weigh()都是通过修改类的原始定义:

C++类新增成员

然而在python中给类对象新增变量或者方法并不需要对原始类定义进行重新修改,随时都可以给类对象新增成员。

pythonyu'yan

那么下面就以下图中的代码为例,为大家演示如何给python中的类对象动态的添加变量/属性和方法:

python示例类

给类对象动态添加成员变量

Python 支持为已创建好的对象动态增加实例变量而不会改变类的原始定义!方法很简单,只需要给类对象的新变量赋值即可,如给示例代码中的对象p新增性别变量sex:

# 为p对象增加一个sex实例变量,直接声明即可p.sex = "男"print(p.sex)运行结果为:男

上述代码为 p 对象动态新增了一个 sex实例变量,即直接对p对象的sex实例变量赋值就能新增一个实例变量。那么如何删除这个动态变量呢?

python也支持动态删除实例变量,使用del语句即可删除,如删除类对象p的name成员变量:

# 删除p对象的name实例变量del p.name# 再次访问p的name实例变量print(p.name)运行结果为:lisi

上述代码使用del动态删除了已经创建好的 p 对象的 name 实例变量,但因类中定义了类变量 name,故程序不会报错;否则会报出 AttributeError 错误,并提示:'Person' object has no attribute 'name'。

给类对象动态添加方法/函数

注意:初学者在理解以下内容之前,需清楚python类中 self 参数的含义和作用,可自行搜索查阅:Python中self的用法!

Python 同时支持为类对象动态新增方法,示例代码中的Person类只定义了一个 height() 方法,而实际使用时,开发人员完全可以为p对象动态增加方法:

两种新增类对象函数的方法

说明:为p对象动态增加方法时,Python 不会自动将调用者自动绑定到类方法的第一个参数self(即使将第一个参数命名为 self 也没用)。通俗的说就是虽然代码形式上(p.weigh())声明了对象p的新方法,但实际上python并不知道该方法是属于对象p的成员方法,需要用代码p.weigh(p)来手动绑定方法weigh()为对象p的新方法。

另一种实现上述绑定功能的方法:使用MethodType模块

def intro_func(self, content):print("("我是一个人")# 导入MethodTypefrom types import MethodType# 使用MethodType对intro_func进行包装,将该函数的第一个参数绑定为pp.intro = MethodType(intro_func, p)# 第一个参数已经绑定了,无需传入p.intro("新增了方法intro,功能由intro_func()实现")

上述代码中,通过 MethodType 包装 intr_func 函数之后,为p对象动态增加的 intro() 方法的第一个参数self就绑定了对象p,因此程序在调用intro() 方法时就自动将intro方法归为p对象的成员方法,而无须传入第一个参数self,功能与在定义Person类时己经定义了 intro() 方法一样。

完整代码演示

完整代码示例

总结

为类对象动态添加成员变量或成员方法是python类操作中非常人性化的设计,在python编程中作用明显,希望本文内容有助于读者学习/工作!最后感谢您的阅读!

谢谢

python创建变量_Python每天一分钟:给类对象动态新增/删除成员变量和方法(函数)...相关推荐

  1. python创建列表_python创建与遍历List二维列表的方法

    python 创建List二维列表 lists = [[] for i in range(3)] # 创建的是多行三列的二维列表 for i in range(3): lists[0].append( ...

  2. python 创建子类_python创建子类的方法分析

    本文实例讲述了python创建子类的方法.分享给大家供大家参考,具体如下: 如果你的类没有从任何祖先类派生,可以使用object作为父类的名字.经典类的声明唯一不同之处在于其没有从祖先类派生---此时 ...

  3. python 竖线 绘图_Python可视化 | Seaborn5分钟入门(二)——barplot countplot

    Seaborn是基于matplotlib的Python可视化库. 它提供了一个高级界面来绘制有吸引力的统计图形.Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图 ...

  4. python创建追加_Python文件的创建与追加

    (转载)https://www.xshell.net/python/python_open.html Posted by 破冰 on 2013-9-17 17:29 Tuesday 一.用Python ...

  5. python创建矩阵_Python创建对称矩阵的方法示例【基于numpy模块】

    本文实例讲述了Python创建对称矩阵的方法.分享给大家供大家参考,具体如下: 对称(实对称)矩阵也即: step 1:创建一个方阵 >>> import numpy as np & ...

  6. 如何用python创建文件_python在指定目录创建文件

    Python无法创建文件夹,如何制定创建目录?温柔也好,凶狠也罢.想有一个陌生的自己,给自己一些惊喜. /主目录/桌面/gnssIR_python-master:/usr/local/bin:/usr ...

  7. python类的成员函数_Python为类对象动态添加成员函数

    Python: 为对象动态添加函数 , 且函数定义 来自一个 str 在 Python 中 , 通常情况下 , 你只能为对象添加一个已经写好的方法 需求 : 传入一个 str 类型的变量 , 其值是一 ...

  8. python关键字定义_python使用什么关键字定义类

    详细内容 什么是类? 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 什么是方法? 类中的函数即为方法 如何定义一个类? 定义类,语法格式如下: ...

  9. python定义一个_Python,包括定义一个类

    我有一个我要解决的问题: 编写一个包含以下内容的类contentResult的定义: •String类型的实例变量winner,初始化为空字符串.在 •String类型的实例变量second_plac ...

最新文章

  1. mysql grant all详解_MySQL grant 语法的详细解析
  2. python 系统进程_在Python中监视所有系统进程
  3. mysql 高可用测试_mysql MHA高可用测试
  4. mysql 优化not null_mysql 优化之11:尽可能的使用 NOT NULL
  5. oracle临时表经常被锁_这是一篇长篇入门级数据库讲解:oracle数据库数据导入导出步骤
  6. android recyclerview添加头部,Android RecyclerView添加Header头部
  7. Decide what you want,and go after it with everything you got!
  8. 零库存挑战-分压电阻选择器V1.01【下载地址发布】
  9. 软件工程计算机专业基于SSM的汽车租赁管理系统 I的毕业论文
  10. IP静态路由实验(基于华为eNSP模拟器)
  11. SSH远程控制与访问
  12. 阿里云 Linux 3 安装mysql 亲测有效
  13. 微信小程序复用公众号资质快速认证
  14. JS 如何调用高德地图
  15. [PaPaPa][需求说明书][V0.1]
  16. java多线程 丢数据_多线程list.add()丢数据
  17. Vue项目中使用字体文件库
  18. 树莓派安装tensorflow(玩转树莓派(三))
  19. Spring六:Spring AOP API 上
  20. 赛元单片机-触摸库使用总结

热门文章

  1. Git根据commitId查看提交内容:根据commitId查看某次提交的内容
  2. Linux的Nginx四:功能|模块
  3. java preparedstatement 关闭_java - 如果基础连接已关闭,为什么isClosed()方法对PreparedStatements不返回true? - 堆栈内存溢出...
  4. android view超出屏幕_Android APP界面保持屏幕常亮方法
  5. 给array添加元素_前囧(06篇)Array 方法详解
  6. openshift安装部署_OpenShift 4 HOL (1) - 多种方法部署容器化应用
  7. 扬州大学广陵学院计算机网络试卷,扬州大学广陵学院控制工程考试样卷B.doc
  8. android xe 调用 java,Delphi XE6 for Android 让手机震动(调用Java的函数)
  9. Spring MVC @ModelAttribute 数据绑定
  10. 【mybatis mapper XML】List类型入参参数处理