借助于python的动态语言特性,很容易对对象进行添加方法或者属性,这也是python的灵活之一。

动态生成类的属性及其方法

在某些情况可能要根据不同的参数来动态生成不同的实例方法、静态方法、类方法。下面的例子中则展示了如何动态地向类中添加属性和方法。

import typesclass Person():def __init__(self,name): self.name = name li = Person('Lily')
li.age = 20  # 实例属性添加,仅对当下实例有效
tom = Person('Tom')
print(tom.age) # 'Person' object has no attribute 'age'Person.age = None  # 类属性添加
print(tom.age)  # Nonedef eat(self): print('%s正在吃东西。。'%self.name) li.eat = types.MethodType(eat, li) # 实际上python所有类都是type类的实例对象,动态添加了Person的实例方法
li.eat() @staticmethod
def test():  print('这是一个静态方法。')Person.test = test  # 动态添加动态方法
Person.test()  @classmethod
def test(cls): print(cls.age) # None,访问动态创建的ageprint('这是一个类方法。')Person.test = test # 动态添加类方法
Person.test() class test(object): __slots__ = ('name','age') # 使用slots来将属性固定,不允许增删

动态地创建类

由于所有类都是type类的对象,所以也可以通过type动态地创建类。

Test = type('Test',(object,),{'num':0})  # 所有类都是type的对象,param1为类名,param2为继承对象,num为类属性,方法class Test(object): # 与上述代码等效num = 0

如果需要添加属性方法,则在相应的传参字典中添加对应的方法,例如:

Test = type('Test',(object,),{'num':0, 'foo': fun})

动态访问类中的属性方法

动态地方法类中的属性方法,也是一种反射机制。python中的反射/自省的实现,是通过hasattr、getattr、setattr、delattr四个内置函数实现的,其实这四个内置函数不只可以用在类和对象中,也可以用在模块等其他地方,只是在类和对象中用的很多,所以单独提出来进行解释。

  • hasattr(key) # 返回的是一个bool值,判断某个成员或者属性在不在类或者对象中
  • getattr(key,default=xxx) # 获取类或者对象的成员或属性,如果不存在,则会抛出AttributeError异常,如果定义了default那么当没有属性的时候会返回默认值。
  • setattr(key,value)假如有这个属性,那么更新这个属性,如果没有就添加这个属性并赋值value
  • delattr(key)删除某个属性

其用法如下所示:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流QQ群:725638078
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Foo:def __init__(self,name,age):self.name=nameself.age=agedef show(self):return self.name,self.ageobj=Foo("Tom",18)
print(getattr(obj,"name"))  # Tom
setattr(obj,"k1",eat)
print(obj.k1) # <function eat at 0x00000162CAD661F0>
print(hasattr(obj,"k1")) # True
delattr(obj,"k1")
show_fun=getattr(obj,"show")
print(show_fun()) # ('Tom', 18)

动态访问普通全局函数

有时候需要通过函数名来动态访问全局的函数,那么依然有三种方法。

  • 通过eval,不同由于考虑到安全因素,不能直接这样去写,可能会得到恶意代码
eval("print")("hello,world!")
  • 通过建立字典,事先将需要调用的函数全部放入字典,缺点是每增加一个动态函数,就要更改字典:
dynamic_fun = {"print": print }
dynamic_fun["print"]("hello,world!")
  • 通过调用global()来使用
    global()维护了一个全局的变量列表,其实现过程和方式2类似,具体使用时通```global().get(fun_name)来完成。

类中其他内建属性方法(魔术方法)

  • __init__ # 构造初始化函数,__new__之后运行
  • __new__ # 创建实例所需的属性,类似于构造方法
  • __call__ # 可以使得类的实例通过function方式访问
  • __class__# 实例所在的类,实例.__class__
  • __str__ # 实例的字符串表示,可读性高
  • __repr__ # 实例的字符串表示,准确性高
  • __del__ # 删除实例引用,类似于析构方法
  • __dict__ # 实力自定义属性,vars(实例.__dict__)
  • __doc__ # 类文档,help(类或者实例)
  • __bases__ #当前类的所有父类
  • __getattribute__#属性访问拦截器

结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!

Python基础入门教程推荐:更多Python视频教程-关注B站:Python学习者

Python爬虫案例教程推荐:更多Python视频教程-关注B站:Python学习者

Python动态类和动态方法的创建和调用相关推荐

  1. 【Groovy】MOP 元对象协议与元编程 ( Expando 动态类 | 创建动态类 | 为动态类增加字段和方法 )

    文章目录 一.Expando 动态类简介 二.动态类创建 三.为动态类增加字段和方法 四.完整代码示例 一.Expando 动态类简介 Groovy 运行时 , 可以动态地创建一个类 , 该类称为 & ...

  2. python 自定义类(特殊方法)

    文章目录 1. 对象表示形式 2. 可散列的类 3. 私有属性的利弊 4. `__slots__` 类属性节省空间 5. 覆盖类属性 learn from <流畅的python> from ...

  3. python获取类的所有方法、并存放到字典中_孤荷凌寒自学python第十二天python字典类的其它操作...

    今天继续对dict类进行研究 一.删除dict对象中的所有元素 dictname.clear() 此方法将删除dict对象中的全部元素,但字典对象本身还在. 二.关于建立dict的副本,即创建一个di ...

  4. 使用Thread类和Runnable方法来创建一个线程的区别

    第一:Thread类需要被继承,然后重写run()方法,但是Java中的类是单继承的,也就是说,若某个类继承Thread获取线程功能后,就不能再继承别的类了.但是Runnable接口解决了这个问题,某 ...

  5. python的类属性和方法_Python 类的属性和方法

    本文介绍Python类中的属性和方法.和大部分语言类似,Python中的属性和方法也公有(public)和私有(private) 的区分. 一.类的公有和私有属性: 在Python中一般定义的属性为公 ...

  6. 梳理:python—同一个类中的方法调用

    为什么突然在此提到这个梳理问题呢? 因为在自己实践综合练习学过的知识时,突然觉得有些知识点的运用总是不成功,于是翻过课本进行回顾,总是觉得是对的,可是当再进一步思考"既然是对的,为什么在程序 ...

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

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

  8. python的类属性和方法_Python中类属性、实例属性和实例方法的区别

    你似乎对概念有相当好的理解.很难找到用通用方式解释的信息,尤其是像python这样一种广泛使用的语言.我基本上会附和你的正确假设,并在此过程中做一些小的调整.在 类属性是将从类共享创建的所有对象的特征 ...

  9. python类中方法的执行顺序-python – 新式类中的方法解析顺序(MRO)?

    在Python in a Nutshell(第2版)一书中有一个使用的例子 旧样式类,用于演示如何以经典分辨率顺序解析方法 它与新订单有何不同. 我通过重写新样式的示例尝试了相同的示例,但结果与使用旧 ...

最新文章

  1. 求任意数阶乘最后一位
  2. 利用被入侵的路由器迈入内网——抓包,利用路由器漏洞入侵,进行流量劫持...
  3. t3软件怎么生成报表_临沂用友畅捷通T3财务通软件财税一体化
  4. 阿里是如何“宠”员工的?除了福利,还有这满屏黑科技
  5. 【论文解读】IJCAI2019: 面向中文NER 基于lexicon rethinking的CNN模型
  6. cpu性能测试那个软件准,cpu对比测试软件 CPU性能测试软件推荐
  7. 华南主板超频设置图解_支持XMP2.0,3000稳超3733MHz,威刚龙耀D60G超频体验
  8. ElasticSearch搜索引擎搭建笔记
  9. windows系统自带工具dxdiag查看电脑信息
  10. 【Python网络蜘蛛 · 6】:明文和密文的转换、json模块的使用、jsonpath模块的使用(附源代码)
  11. 树莓派linux iso镜像下载,树莓派(Raspberry Pi)修改系统镜像(img)
  12. PTA 1054 求平均值 (20 分)
  13. docker框架及模块介绍
  14. KMP算法next数组详解
  15. 注释详细 基于C++实现链表队列 实现模拟医院看病排队问题 实现链表的基本操作
  16. 基于 Hostpot 虚拟机的 Java 对象解析
  17. html5怎么制作音乐相册,怎么制作音乐相册-怎么制作音乐相册并加字幕 就是很多照片制作动画加背景音乐加文字...
  18. 一套键盘鼠标跨电脑切换使用
  19. H3CSE的培训的重要知识点
  20. Qt 正则表达式的使用

热门文章

  1. 从库存管理系统,体验活字格强大的移动端应用开发能力
  2. webService的简单使用
  3. 服务器-番外篇-搭建samba共享
  4. 输入 n 个整数,输出其中最小的 k 个
  5. thinkphp5部署nginx服务上多站点解决方案!
  6. php : RBAC 基于角色的用户权限控制-表参考
  7. linux之使用帮助
  8. 总结之:CentOS6.5 LAMP的基本原理以及分主机架构解析
  9. arcgis数据文件使用
  10. 微软官方Windows Server 2008实战攻略系列