一、反射机制 *

  反射可以理解为

  • 通过字符串的形式,动态导入模块;
  • 利用字符串的形式,在对象(模块)中操作(查找/获取/删除/添加)成员,是一种基于字符串的事件驱动!

  反射机制的内置函数

  1. # hasattr(object,attr)
  2. # 输入两个参数(对象,字符串类型(方法或属性)),判断一个对象里是否有某个属性或方法,返回布尔值,有为True,否则False
  3. class Foo:
  4. def f1(self):
  5. pass
  6. obj = Foo()
  7. print(hasattr(obj,"f1"))
  8. # 运行结果:True
  9.  
  10. # getattr(object,attr[,default])
  11. # 获取对象的属性或方法,可设置输出默认值,
  12. # 如果获取方法,返回的是内存地址,如果需要运行,后面添加一对括号
  13. class Foo:
  14. def f1(self):
  15. print("获取了f1方法")
  16. obj = Foo()
  17. ret = getattr(obj,"f1")
  18. ret()
  19. print(ret)
  20. # 运行结果:获取了f1方法 \
  21. # <bound method Foo.f1 of <__main__.Foo object at 0x0000024FE505E9B0>>
  22.  
  23. # setattr(object,attr,values)
  24. # 动态的给对象的属性赋值(内存地址),若属性不存在,则先创建再赋值
  25. class Foo:
  26. def __init__(self,a1):
  27. self.a1 = a1
  28. obj = Foo(1)
  29. print(getattr(obj,"a1"))
  30. #运行结果:1
  31. setattr(obj,"a1",2) # 将对象中的属性重新赋值
  32. print(getattr(obj,"a1"))
  33. #运行结果:2
  34. setattr(obj,"a2",3) #在对象中创建一个新的属性a2并赋值
  35. print(getattr(obj,"a2"))
  36. #运行结果:3
  37.  
  38. # delattr(object,attr,values)
  39. # 动态的删除对象的属性(内存地址)
  40. class Foo:
  41. def __init__(self,a1):
  42. self.a1=a1
  43. obj = Foo(1)
  44. print(getattr(obj,"a1"))
  45. # 运行结果: 1
  46. setattr(obj,"a2",2)
  47. print(getattr(obj,"a2"))
  48. # 运行结果: 2
  49. delattr(obj,"a2")
  50. print(getattr(obj,"a2")) #删除对象中的属性
  51. #运行结果:AttributeError: 'Foo' object has no attribute 'a2'

反射的内置函数

二、如何正确的判断方法与函数?

  目前我们印象中的方法就是封装在类内部的函数,实际上这样说不严谨;

  

  1. # 如何判断方法与函数
  2. # tpye
  3. # 判断类型
  4. class Foo:
  5. def f1(self):
  6. pass
  7. obj = Foo()
  8. print(obj,type(obj.f1)) # 当我们用对象调用类中的方法时,我们通过type查看到的是方法
  9. # 运行结果:<__main__.Foo object at 0x0000028E0F10E898> <class 'method'>
  10. print(Foo,type(Foo.f1)) # 当我们用类调用类中的方法时,我们通过type查看到的是函数
  11. # 运行结果:<class '__main__.Foo'> <class 'function'>
  12. # 总结:封装在类中的函数通过对象调用时是真正的方法。

三、callattr()、issubclass()、isinstance、type()的使用

  callattr()方法是用来判断传入的参数是否可以被调用

  1. callable
  2. 判断输入的参数是否可以被调用
  3. class Foo:
  4. def f1(self):
  5. pass
  6. def __call__(self, *args, **kwargs):
  7. pass
  8. def func():
  9. pass
  10. obj = Foo()
  11. print(callable(Foo)) # 类是可以被调用的类型
  12. # 运行结果: True
  13. print(callable(obj.f1)) # 方法是可以被调用的类型
  14. # 运行结果: True
  15. print(callable(func)) #函数是可以被调用的类型
  16. # 运行结果: True
  17. print(callable(obj)) #实例化的对象是可以被调用的类型,注:类的内部要有__call__方法
  18. # 运行结果: True

  issubclass()方法是用判断传入的两个参数,前一个参数是否是后一个参数的派生类

  1. # issubclass
  2. # 判断传入的两个参数,前一个参数是否是后一个参数的子类
  3. class Base:
  4. pass
  5. class Foo(Base):
  6. pass
  7. print(issubclass(Foo,Base))
  8. # 运行结果: True

  isinstance()方法是判断传入两个参数,第一个传入的参数(对象),是否是第二个参数(类)的实例

  

  1. # isinstance
  2. # 判断传入两个参数,第一个传入的参数(对象),是否是第二个参数(类)的实例
  3. class Base:
  4. def f1(self):
  5. pass
  6. def f2(self):
  7. pass
  8. class Foo(Base):
  9. def f1(self):
  10. pass
  11. class Last:
  12. pass
  13. obj = Foo()
  14. print(isinstance(obj,Last))
  15. #运行结果:False
  16. print(isinstance(obj,Foo)) # obj是Foo类的一个实例化对象
  17. #运行结果:True
  18. print(isinstance(obj,Base))# obj也可以是Foo基类的一个实例化对象
  19. #运行结果:True
  20. # 总结:isinstance可以判断对象是否是类或类的基类中的实例

  type()

  1. # type
  2. # 判断传入的参数(对象)是哪个类的实例化对象
  3. class Base:
  4. pass
  5. class Foo(Base):
  6. pass
  7. obj = Foo()
  8. print(obj,type(obj)) # 获取当前对象是由哪个类创建
  9. # 运行结果: <__main__.Foo object at 0x000001567FC9E8D0> <class '__main__.Foo'>

python之反射机制与callattr()、issubclass()、isinstance、type()相关的更多相关文章

  1. python的反射机制

    转载自:http://www.cnblogs.com/feixuelove1009/p/5576206.html 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作 ...

  2. 简单谈谈python的反射机制

    转:http://www.jb51.net/article/87479.htm 本文主要介绍python中的反射,以及该机制的简单应用,熟悉JAVA的程序员,一定经常和Class.forName打交道 ...

  3. 【转】简单谈谈python的反射机制

    [转]简单谈谈python的反射机制 对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面 ...

  4. 详解python之反射机制

    一.前言 def f1(): print('f1') def f2(): print('f2') def f3(): print('f3') def f4(): print('f4') a = 1 t ...

  5. Python之反射机制

    什么是反射? 1.有时我们要访问某个变量或是方法时并不知道到底有没有这个变量或方法,所以就要做些判断.判断是否存在字符串对应的变量及方法.2.我们知道访问变量时是不能加引号的,否则会被当成字符串处理. ...

  6. Python 的反射机制

    什么叫做反射 利用字符串的形式去对象(模块)中操作(查找/添加/获取/删除)成员,一种基于字符串的事件驱动. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以 ...

  7. python面向对象--反射机制

    class Black: feture="ugly" def __init__(self,name,addr): self.addr=addr self.name=name def ...

  8. python反射机制深入分析

    对编程语言比较熟悉的朋友,应该知道“反射”这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述pyth ...

  9. python 反射机制在实际的应用场景讲解

    剖析python语言中 "反射" 机制的本质和实际应用场景一. 前言 def s1(): print("s1是这个函数的名字!") s = "s1&q ...

随机推荐

  1. python flask框架学习(三)——豆瓣微信小程序案例(一)templates的使用,宏的使用,前端后台传数据,前端写python语句

    目录 一.templates的使用 (1)在templates里创建一个index.html (2)再在app.py里写 (3)展示效果 二.构建第一个电影评分 (1)准备好素材放进static里的i ...

  2. pytorch 中Dataloader中的collate_fn参数

    一般的,默认的collate_fn函数是要求一个batch中的图片都具有相同size(因为要做stack操作),当一个batch中的图片大小都不同时,可以使用自定义的collate_fn函数,则一个b ...

  3. Mui manifest.json文档说明

    Mui官方地址:https://ask.dcloud.net.cn/article/94 保存在这里,太难找了!!!!!! 以下是完整的manifest.json配置文件,在HBuilder|HBui ...

  4. Qt跨平台原理

    Qt跨平台原理: 和java一样,针对每一种OS平台,QT都有一套对应的底层类库,而接口是完全一致的. 因此只要是在QT库上开发的程序,放在任何一种平台下都可以编译运行(前提条件是:程序中没有使用某O ...

  5. ROS安装,配置

    ROS最好安装在Ubuntu系统,因为ROS目前在其他的系统中都是试验性的 ! <Learning ROS for Robotics Programming-- second Edition&g ...

  6. supervisor+daphne+djangochannels

    参照官网配置:https://channels.readthedocs.io/en/latest/deploying.html 1.supervisor 主要是用来管理进程,比如我们想让一个进程一直执 ...

  7. 公钥、私钥、数字签名、数字证书、对称与非对称算法、HTTPS

    作者: yoyoso https://my.oschina.net/ioslighter/blog/359207 对公钥和私钥有点稀里糊涂的,搜索了一些资料,作一些整理吧,先看这个: 加密--公钥 看 ...

  8. Scrapy框架1——简单使用

    一.设置与编写 打开cmd,选择好路径 1.创建项目scrapy startproject projectname d:\爬虫\11.scrapy>scrapy startproject tes ...

  9. HCIA SWITCHING&ROUTTING 笔记——第一章 TCP/IP基础知识(2)

    视频地址:https://ilearningx.huawei.com/courses/course-v1:HuaweiX+EBGTC00000336+Self-paced/courseware/abb ...

  10. Arm-Linux 移植 jpeg库

    背景: jpeg库的使用可以提高显示效率. host平台 :Ubuntu 16.04 arm平台 : S5P6818   jpeg    :v9c arm-gcc :4.8.1 主机准备: 运行以下脚 ...