我的Python学习笔记(四):动态添加属性和方法
一、动态语言相关概念
1.1 动态语言
- 在运行时代码可以根据某些条件改变自身结构
- 可以在运行时引进新的函数、对象、甚至代码,可以删除已有的函数等其他结构上的变化
- 常见的动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang
1.2 动态类型语言
- 在运行期间检查数据类型的语言
- 数据类型不是在编译阶段决定的,而是把类型绑定延后到了运行阶段
- 常见的动态类型语言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl
1.3 强类型语言
- 一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,那么它就永远是这个数据类型
- 常见的强类型语言:Java、C#、Python、Object-C、Ruby
Python是动态语言,动态类型语言,也是强类型语言。所以Python可以在运行时改变自身结构,动态添加/删除属性和方法。接下来将介绍Python如何动态添加属性和方法。
二、动态添加属性
2.1 添加对象属性
class Person(object):def __init__(self, newName, newAge):self.name = newNameself.age = newAgezhangsan = Person("张三", 18) zhangsan.addr = "北京" # 类对象zhangsan动态添加对象属性addr print(zhangsan.name) # 张三 print(zhangsan.age) # 18 print(zhangsan.addr) # 北京 lisi = Person("李四", 28) print(lisi.name) # 李四 print(lisi.age) # 28 print(lisi.addr) # 'Person' object has no attribute 'addr'
由以上代码可知,Person类有两个属性:name和age。通过[对象名.属性名]给类对象zhangsan动态添加了对象属性addr,而Person的另一个类对象lisi却不能调用这个属性。
注:通过对象名添加的对象属性,只有这个对象能使用
2.2 添加类属性
class Person(object):def __init__(self, newName, newAge):self.name = newNameself.age = newAgePerson.addr = "北京" # 类Person动态添加类属性addr zhangsan = Person("张三", 18) print(zhangsan.name) # 张三 print(zhangsan.age) # 18 print(zhangsan.addr) # 北京 lisi = Person("李四", 28) print(lisi.name) # 李四 print(lisi.age) # 28 print(lisi.addr) # 北京
由以上代码可知,通过[类名.属性名]给类Person动态添加了类属性addr,Person的类对象zhangsan和lisi都能调用这个属性
注:通过类名添加的类属性,这个类的所有对象都能使用
三、动态添加方法
类中有三种方法,实例方法,静态方法和类方法,三种方法的区别如下:
- 实例方法:需要绑定要一个对象上,第一个参数默认使用self,会把对象作为第一个参数传递进来
- 静态方法:使用装饰器@staticmethod进行定义,类和对象都可以调用,不需要默认参数
- 类方法:使用装饰器@classmethod进行定义,类和对象都可以调用,第一个参数默认使用cls,会把类作为第一个参数传递进来
3.1 添加实例方法
import typesclass Person(object):def __init__(self, newName, newAge):self.name = newNameself.age = newAgedef eat(self):print("---正在吃---")def run(self):print("---正在跑---")zhangsan = Person("张三", 18) zhangsan.eat() # ---正在吃--- zhangsan.run = types.MethodType(run, zhangsan) # 类对象zhangsan动态添加对象方法run() zhangsan.run() # ---正在跑--- lisi = Person("李四", 28) lisi.eat() # ---正在吃--- lisi.run() # 'Person' object has no attribute 'run'
由以上代码可知,Person类有一个方法:eat()方法。通过[types.MethodType(方法名, 对象名)]给类对象zhangsan动态添加了对象方法run(),同理,Person的另一个类对象lisi不能调用这个方法
注:通过对象名添加的对象方法,只有这个对象能使用
3.2 添加静态方法
class Person(object):def __init__(self, newName, newAge):self.name = newNameself.age = newAgedef eat(self):print("---正在吃---")@staticmethod def staticRun():print("---正在跑---")Person.staticRun = staticRun # 类Person动态添加静态方法staticRun() Person.staticRun() # ---正在跑--- zhangsan = Person("张三", 18) zhangsan.eat() # ---正在吃--- zhangsan.staticRun() # ---正在跑--- lisi = Person("李四", 28) lisi.eat() # ---正在吃--- lisi.staticRun() # ---正在跑---
由以上代码可知,通过[类名.静态方法名]给类Person动态添加了静态方法staticRun(),Person类的Person的类对象zhangsan和lisi都能调用这个方法
注:通过类名添加的静态方法,这个类及这个类的所有对象都能使用
3.3 添加类方法
class Person(object):def __init__(self, newName, newAge):self.name = newNameself.age = newAgedef eat(self):print("---正在吃---")@classmethod def classRun(cls):print("---正在跑---")Person.classRun = classRun # 类Person动态添加类方法classRun() Person.classRun() # ---正在跑--- zhangsan = Person("张三", 18) zhangsan.eat() # ---正在吃--- zhangsan.classRun() # ---正在跑--- lisi = Person("李四", 28) lisi.eat() # ---正在吃--- lisi.classRun() # ---正在跑---
由以上代码可知,通过[类名.类方法名]给类Person动态添加了类方法classRun(),Person类的Person的类对象zhangsan和lisi都能调用这个方法
注:通过类名添加的类方法,这个类及这个类的所有对象都能使用
四、__slots__的使用
通过以上内容,我们知道了如何动态的添加属性和方法。但是,如果我们想要限制class的属性该怎么办?例如:只允许Person实例添加name和age属性。为了达到这个目的,Python允许在定义class的时候,定义一个特殊变量__slots__来限制该class能添加的属性。
import types class Person(object):__slots__ = ("name", "age") # 定义__slots__ def __init__(self, newName, newAge):self.name = newNameself.age = newAgedef eat(self):print("---正在吃---")def run(self):print("---正在跑---")Person.num = 100 # 类Person动态添加类属性num zhangsan = Person("张三", 18) print(zhangsan.name) # 张三 print(zhangsan.age) # 18 print(zhangsan.num) # 100 zhangsan.eat() # ---正在吃--- zhangsan.addr = "北京" # 'Person' object has no attribute 'addr' zhangsan.run = types.MethodType(run, zhangsan) # 'Person' object has no attribute 'run'
通过以上代码可知,__slots__对Person类的动态添加没有限制,而Person类对象zhangsan不能再动态添加对象属性和方法。
对于__slot__有以下几个需要注意的地方:
- __slots__只对类对象进行限制,不对类进行限制
- __slots__不仅限制类对象的属性,还限制类对象的方法
- __slots__仅对当前类起作用,对继承的子类不起作用
- 在子类中定义__slots__,子类允许定义的属性就是自身的__slots__加上父类的__slots__
转载于:https://www.cnblogs.com/semon-code/p/8257826.html
我的Python学习笔记(四):动态添加属性和方法相关推荐
- Python学习笔记:动态添加与删除属性与方法
文章目录 一.Python语言特点 1.动态语言 2.动态类型语言 3.强类型语言 二.动态添加属性 1.添加对象属性 2.添加类属性 三.动态删除属性 1.删除实例属性 2.删除类属性 四.动态添加 ...
- xcode 学习笔记2:动态添加view
xcode 学习笔记2:动态添加view 2011-07-06 16:48:39| 分类: 计算机学习|字号 订阅 前面说的都是用的Interface Builder来编辑.xib文件来给窗口添加各 ...
- JavaScript学习笔记:动态添加与删除表格行
文章目录 一.添加表格行与单元格 二.动态删除表格行与单元格 三.案例演示1 四.案例演示2 一.添加表格行与单元格 Javascript可以控制table,动态的插入行和单元格.rows保存着< ...
- python类的属性和对象属性_在python的类中动态添加属性与生成对象
本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...
- vue脚手架的安装、生命周期、文件导入格式、局部组件和全局组件、动态添加属性和方法、插槽、传值
----------------------------------- DOS命令 进入dos: win+r 切换盘符: d: 查看: dir 打开文件夹: cd 文件夹的名字 返回上一级目录 ...
- 尚硅谷学习笔记-节点的常用属性和方法
节点的常用属性和方法[图片在末尾] 方法: 通过具体的元素节点调用 getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点 appendChild( oChildNode ...
- python学习笔记四-列表
list列表 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 列表是最常用的Python数据类型,它可以作为一个 ...
- python学习笔记(四)、条件、循环及其他语句
1 再谈print和import 1.1 打印多个参数 print 能够同时打印多个表达式,并且能自定义分隔符.如下: print('a','b','c') --> a b c print('a ...
- python学习笔记(四):函数
一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...
最新文章
- 业界首个面向NLP场景深度迁移学习框架
- PHPExcel对于Excel中日期和时间类型的处理
- UPDATE ORACLE(9i OR 10G) USER'S PASSWORD AND GET ORACLE VERSION MESSAGE
- (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新
- opengl嵌入pyqt5编译的分割窗口中
- 超级计算机预测2月有雪寒潮,神预测!中国超级计算提前半个月预测了美国的寒潮...
- android 获取monkey日志_APP压力测试定位问题_monkey篇
- .Net Core with 微服务 - Seq 日志聚合
- 女生在java开发和前端之间不知道选择哪个怎么办?
- fastjson list转json字符串_从fastjson转jackson的血泪史
- Javashop 7.0 商城Https协议修改部分
- 自动化产线自动刀补实现
- Centos7中MySQL的安装并设置开机启动
- Adobe国际认证让科技赋能时尚
- BZOJ3505 CQOI2014数三角形(组合数学)
- 批量移动文件夹到对应文件夹
- 如何设置文档背景颜色
- 浅谈STM32的三种Boot模式
- 【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27
- Android 简述touch事件中的MotionEvent
热门文章
- seurat提取表达矩阵_本周最新文献速递20200719
- python模拟购物车流程_用函数模拟简单的购物车(Python)
- c# combobox集合数据不显示_C#实战036:各种泛型的定义和使用详解
- 读称题写出执行结果html,C++(II)13-14(2)试题B - 往年试卷
- 智能财务师 (544) -(喀麦隆)_智能财务管理师项目组到南京理工大学调研“智能会计”专业学科建设...
- vue快速复制快捷键_vue快捷键与基础指令详解
- 未来教育计算机三级课后题答案,全国计算机三级网络技术课后题答案(2016.3 未来教育).docx...
- android 6.0 短信权限,Android6.0权限适配
- html页面的ajax请求,【提问】ajax请求返回整个html页面
- Windows核心编程_注册表操作和小练习程序关联