一、反射机制 *

  反射可以理解为

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

  反射机制的内置函数

 # hasattr(object,attr)
# 输入两个参数(对象,字符串类型(方法或属性)),判断一个对象里是否有某个属性或方法,返回布尔值,有为True,否则False
class Foo:
def f1(self):
pass
obj = Foo()
print(hasattr(obj,"f1"))
# 运行结果:True # getattr(object,attr[,default])
# 获取对象的属性或方法,可设置输出默认值,
# 如果获取方法,返回的是内存地址,如果需要运行,后面添加一对括号
class Foo:
def f1(self):
print("获取了f1方法")
obj = Foo()
ret = getattr(obj,"f1")
ret()
print(ret)
# 运行结果:获取了f1方法 \
# <bound method Foo.f1 of <__main__.Foo object at 0x0000024FE505E9B0>> # setattr(object,attr,values)
# 动态的给对象的属性赋值(内存地址),若属性不存在,则先创建再赋值
class Foo:
def __init__(self,a1):
self.a1 = a1
obj = Foo(1)
print(getattr(obj,"a1"))
#运行结果:1
setattr(obj,"a1",2) # 将对象中的属性重新赋值
print(getattr(obj,"a1"))
#运行结果:2
setattr(obj,"a2",3) #在对象中创建一个新的属性a2并赋值
print(getattr(obj,"a2"))
#运行结果:3 # delattr(object,attr,values)
# 动态的删除对象的属性(内存地址)
class Foo:
def __init__(self,a1):
self.a1=a1
obj = Foo(1)
print(getattr(obj,"a1"))
# 运行结果: 1
setattr(obj,"a2",2)
print(getattr(obj,"a2"))
# 运行结果: 2
delattr(obj,"a2")
print(getattr(obj,"a2")) #删除对象中的属性
#运行结果:AttributeError: 'Foo' object has no attribute 'a2'

反射的内置函数

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

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

  

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

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

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

 callable
判断输入的参数是否可以被调用
class Foo:
def f1(self):
pass
def __call__(self, *args, **kwargs):
pass
def func():
pass
obj = Foo()
print(callable(Foo)) # 类是可以被调用的类型
# 运行结果: True
print(callable(obj.f1)) # 方法是可以被调用的类型
# 运行结果: True
print(callable(func)) #函数是可以被调用的类型
# 运行结果: True
print(callable(obj)) #实例化的对象是可以被调用的类型,注:类的内部要有__call__方法
# 运行结果: True

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

 # issubclass
# 判断传入的两个参数,前一个参数是否是后一个参数的子类
class Base:
pass
class Foo(Base):
pass
print(issubclass(Foo,Base))
# 运行结果: True

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

  

 # isinstance
# 判断传入两个参数,第一个传入的参数(对象),是否是第二个参数(类)的实例
class Base:
def f1(self):
pass
def f2(self):
pass
class Foo(Base):
def f1(self):
pass
class Last:
pass
obj = Foo()
print(isinstance(obj,Last))
#运行结果:False
print(isinstance(obj,Foo)) # obj是Foo类的一个实例化对象
#运行结果:True
print(isinstance(obj,Base))# obj也可以是Foo基类的一个实例化对象
#运行结果:True
# 总结:isinstance可以判断对象是否是类或类的基类中的实例

  type()

 # type
# 判断传入的参数(对象)是哪个类的实例化对象
class Base:
pass
class Foo(Base):
pass
obj = Foo()
print(obj,type(obj)) # 获取当前对象是由哪个类创建
# 运行结果: <__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. LeetCode_371. Sum of Two Integers

    371. Sum of Two Integers Easy Calculate the sum of two integers a and b, but you are not allowed to ...

  2. jquery创建一个新的节点对象(自定义结构/内容)的好方法

    jq创建一个新的节点对象,这对一些自定义功能很有帮助,而且可以随意控制对象的结构与内容,何乐而不为呢,看到这里,相信有些朋友已经按耐不住了,好记下来为大家介绍实现方法,感兴趣的朋友可以了解下哦 < ...

  3. Keil MDK仿真调试STM32的时候直接进入SystemInit函数

    1. 仿真的时候,进入之后 2. 说是main()未定义,可是明明定义了,什么原因?喔,看错了,是--main.对比了一下和正常工厂的配置,都一样,换个jlink V9测试一下吧.换了个ST LINK ...

  4. 常见问题:MySQL/事务隔离

    数据库并行产生的问题 A事务撤销时,将B事务更改的数据撤销. A事务提交时,将B事务更改的同行数据覆盖. 脏读:A事务读取到了B事务未提交的数据. 不可重复读:A事务中同查询语句不幂等,读到已更新数据 ...

  5. 你应该知道的4个DSP开发支持库

    引言 在dsp开发中,为了节省开发时间和难度,TI将一些成熟的算法封装为模块,供开发者使用.如果能充分利用这些算法支持库,对于加快dsp开发进程与提高代码质量.稳定性有非常大的帮助. Digital ...

  6. Linux DHCP 服务器配置与管理

    一.环境介绍: 运行软件:VMware Workstation Pro 14 系统环境:CentOS-7-x86_64-1810 二.操作配置: 1.DHCP 服务器搭建 1)安装DHCP yum i ...

  7. [转帖]14-使用glusterfs做持久化存储

    14-使用glusterfs做持久化存储 https://www.cnblogs.com/guigujun/p/8366558.html 使用glusterfs做持久化存储 我们复用kubernete ...

  8. Java多线程系列--AQS之 LockSupport

    concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS(JAVA CAS原理.unsafe.AQS)框架借助于两个类: Unsafe(提供CAS操作 ...

  9. 以php中的自增自自减运算符操作(整型,浮点型,字符串型,布尔型,空类型)数据

    // 环境 // // php版本 // PHP 7.0.33-0+deb9u1 (cli) (built: Dec 7 2018 11:36:49) ( NTS ) // Copyright (c) ...

  10. k8s 启动pod的问题

    版本: k8s 1.5 docker 1.3 CentOS 7.6 使用命令 kubectl get pods输出no resources.解决方法是修改 apiserver 的配置文件 vim /e ...