一、动态语言相关概念

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学习笔记(四):动态添加属性和方法相关推荐

  1. Python学习笔记:动态添加与删除属性与方法

    文章目录 一.Python语言特点 1.动态语言 2.动态类型语言 3.强类型语言 二.动态添加属性 1.添加对象属性 2.添加类属性 三.动态删除属性 1.删除实例属性 2.删除类属性 四.动态添加 ...

  2. xcode 学习笔记2:动态添加view

    xcode 学习笔记2:动态添加view 2011-07-06 16:48:39|  分类: 计算机学习|字号 订阅 前面说的都是用的Interface Builder来编辑.xib文件来给窗口添加各 ...

  3. JavaScript学习笔记:动态添加与删除表格行

    文章目录 一.添加表格行与单元格 二.动态删除表格行与单元格 三.案例演示1 四.案例演示2 一.添加表格行与单元格 Javascript可以控制table,动态的插入行和单元格.rows保存着< ...

  4. python类的属性和对象属性_在python的类中动态添加属性与生成对象

    本文将通过一下几个方面来一一进行解决 1.程序的主要功能 2.实现过程 3.类的定义 4.用生成器generator动态更新每个对象并返回对象 5.使用strip 去除不必要的字符 6.rematch ...

  5. vue脚手架的安装、生命周期、文件导入格式、局部组件和全局组件、动态添加属性和方法、插槽、传值

    -----------------------------------    DOS命令 进入dos:  win+r 切换盘符: d: 查看: dir 打开文件夹: cd 文件夹的名字 返回上一级目录 ...

  6. 尚硅谷学习笔记-节点的常用属性和方法

    节点的常用属性和方法[图片在末尾] 方法: 通过具体的元素节点调用 getElementsByTagName() 方法,获取当前节点的指定标签名孩子节点 appendChild( oChildNode ...

  7. python学习笔记四-列表

    list列表 序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 列表是最常用的Python数据类型,它可以作为一个 ...

  8. python学习笔记(四)、条件、循环及其他语句

    1 再谈print和import 1.1 打印多个参数 print 能够同时打印多个表达式,并且能自定义分隔符.如下: print('a','b','c') --> a b c print('a ...

  9. python学习笔记(四):函数

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...

最新文章

  1. 业界首个面向NLP场景深度迁移学习框架
  2. PHPExcel对于Excel中日期和时间类型的处理
  3. UPDATE ORACLE(9i OR 10G) USER'S PASSWORD AND GET ORACLE VERSION MESSAGE
  4. (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新
  5. opengl嵌入pyqt5编译的分割窗口中
  6. 超级计算机预测2月有雪寒潮,神预测!中国超级计算提前半个月预测了美国的寒潮...
  7. android 获取monkey日志_APP压力测试定位问题_monkey篇
  8. .Net Core with 微服务 - Seq 日志聚合
  9. 女生在java开发和前端之间不知道选择哪个怎么办?
  10. fastjson list转json字符串_从fastjson转jackson的血泪史
  11. Javashop 7.0 商城Https协议修改部分
  12. 自动化产线自动刀补实现
  13. Centos7中MySQL的安装并设置开机启动
  14. Adobe国际认证让科技赋能时尚
  15. BZOJ3505 CQOI2014数三角形(组合数学)
  16. 批量移动文件夹到对应文件夹
  17. 如何设置文档背景颜色
  18. 浅谈STM32的三种Boot模式
  19. 【mysql升级步骤】windows mysql版本升级 ,mysql 5.6 升级到5.7.27
  20. Android 简述touch事件中的MotionEvent

热门文章

  1. seurat提取表达矩阵_本周最新文献速递20200719
  2. python模拟购物车流程_用函数模拟简单的购物车(Python)
  3. c# combobox集合数据不显示_C#实战036:各种泛型的定义和使用详解
  4. 读称题写出执行结果html,C++(II)13-14(2)试题B - 往年试卷
  5. 智能财务师 (544) -(喀麦隆)_智能财务管理师项目组到南京理工大学调研“智能会计”专业学科建设...
  6. vue快速复制快捷键_vue快捷键与基础指令详解
  7. 未来教育计算机三级课后题答案,全国计算机三级网络技术课后题答案(2016.3 未来教育).docx...
  8. android 6.0 短信权限,Android6.0权限适配
  9. html页面的ajax请求,【提问】ajax请求返回整个html页面
  10. Windows核心编程_注册表操作和小练习程序关联