一、内置函数(补充)
    
    1、issubclass() -- 方法用于判断参数 class 是否是类型参数 classinfo 的子类。
    语法格式:issubclass(class, classinfo)

                class -- 类 classinfo -- 类     如果 class 是 classinfo 的子类返回 True,否则返回 False

 class A:
pass
class B(A):
pass
print(issubclass(B,A)) # 返回 True
 
    2、isinstance() -- 函数来判断一个对象是否是一个已知的类型,类似 type()
    (1) isinstance() 与 type() 区别:
 
        type() 不会认为子类是一种父类类型,不考虑继承关系。
        isinstance() 会认为子类是一种父类类型,考虑继承关系。
  

  语法格式:isinstance(object, classinfo)
               object -- 实例对象
                    classinfo -- 可以是直接或间接类名、基本类型或者由它们组成的元组
                         如果对象的类型与参数二的类型(classinfo)相同则返回 True,否则返回 False。
 >>>a = 2
>>> isinstance (a,int) True
>>> isinstance (a,str) False
>>> isinstance (a,(str,int,list)) # 是元组中的一个返回 True True
 class A:
pass
class B(A):
pass
isinstance(A(), A) # returns True
type(A()) == A # returns True
isinstance(B(), A) # returns True
type(B()) == A # returns False
 class Animal:
pass class Cat(Animal):
pass class BoSiCat(Cat):
pass a = Animal()
print(isinstance(a, Animal)) # 自己类可以判断
print(isinstance(a, Cat)) # 子类不能判断 c = BoSiCat()
print(isinstance(c, Animal)) # True 子类的对象可以当成父类的类型来看.
# isinstance判断的是对象是否是xxx家族体系的内容. 往上找

3、type

 class Animal:
pass class Cat(Animal):
pass class BoSiCat(Cat):
pass c = Cat()
print(type(c)) # 比较精准的给出对象的类 <class '__main__.Cat'> 计算a+b的结果并返回. 两个数相加
def add(a, b):
if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
return a + b
else:
print("算不了")
print(add("胡汉三", 2.5))
二、判断方法还是函数
 
    1. 类方法. 不论任何情况, 都是方法.
    2. 静态方法, 不论任何情况. 都是函数
    3. 实例例方法, 如果是实例访问. 就是方法. 如果是类名访问就是函数.

 # 引入两个模块
from types import FunctionType, MethodType def haha(arg):
print(isinstance(arg, FunctionType)) # False
print(isinstance(arg, MethodType)) # True
haha(Foo.age)
三、反射
 
    1、getattr( )、hasattr()

 import master
from types import FunctionType
while 1:
print("""作为, 我帮你写了:
chi
he
la
shui
等功能. 看看吧""")
gn = input("请输你要测试的功能:")
# niuB版
if hasattr(master, gn): # 如果master有你要的功能 attr = getattr(master, gn) # 获取这个功能, 并执
if isinstance(attr, FunctionType): # 判断是否是函数. 只有函数才可以被调
attr()
else: # 如果不是函数, 就打印
print(attr)
    getattr()来获取信息. hasattr()来判断xxx中是否包含了xxx功能, 那么我们可以在模块中这样来使反射

 class Person:
country = "清"
def chi(self):
pass
# 类中的内容可以这样动态的进获取
print(getattr(Person, "country"))
print(getattr(Person, "chi")) # 相当于Foo.func 函数
# 对象样可以
obj = Person()
print(getattr(obj, "country")) #
print(getattr(obj, "chi")) # 相当于obj.func 法 结果:

<function Person.chi at 0x02CB5150>

<bound method Person.chi of <__main__.Person object at 0x01055870>>
    2、其他方法 setattr、delattr
    (1) setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这的value可以是值, 也可以是函数或者方法
    (2) delattr(obj, str) 把obj中的str成员删除掉

 #设置成员
print(obj.name) #设置之前为:abc
ret = setattr(obj,'name',19)
print(obj.name) #设置之后为:19
#删除成员
print(obj.name) #abc
delattr(obj,'name')
print(obj.name) #报错
小节:1.根据字符串的形式导入模块。2.根据字符串的形式去对象(某个模块)中操作其成员, 反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动

 1. getattr()函数是Python自省的核心函数,具体使用大体如下:
class A:
def __init__(self):
self.name = 'zhangjing'
#self.age='24'
def method(self):
print"method print" Instance = A()
print getattr(Instance , 'name, 'not find') #如果Instance 对象中有属性name则打印self.name的值,否则打印'not find'
print getattr(Instance , 'age', 'not find') #如果Instance 对象中有属性age则打印self.age的值,否则打印'not find'
print getattr(a, 'method', 'default') #如果有方法method,否则打印其地址,否则打印default
print getattr(a, 'method', 'default')() #如果有方法method,运行函数并打印None否则打印default 2. hasattr(object, name) 说明:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect, name)是否抛出异常来实现的) 3. setattr(object, name, value) 这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串可能会列出一个现有的属性或一个新的属性。这个函数将值赋给属性的。该对象允许它提供。例如,setattr(x,“foobar”,123)相当于x.foobar = 123。 4. delattr(object, name) 与setattr()相关的一组函数。参数是由一个对象(记住python中一切皆是对象)和一个字符串组成的。string参数必须是对象属性名之一。该函数删除该obj的一个由string指定的属性。delattr(x, 'foobar')=del x.foobar

19_python_反射的更多相关文章

  1. 隐私泄露杀手锏 —— Flash 权限反射

    [简版:http://weibo.com/p/1001603881940380956046] 前言 一直以为该风险早已被重视,但最近无意中发现,仍有不少网站存在该缺陷,其中不乏一些常用的邮箱.社交网站 ...

  2. Java学习之反射机制及应用场景

    前言: 最近公司正在进行业务组件化进程,其中的路由实现用到了Java的反射机制,既然用到了就想着好好学习总结一下,其实无论是之前的EventBus 2.x版本还是Retrofit.早期的View注解框 ...

  3. 关于 CSS 反射倒影的研究思考

    原文地址:https://css-tricks.com/state-css-reflections 译者:nzbin 友情提示:由于演示 demo 的兼容性,推荐火狐浏览.该文章篇幅较长,内容庞杂,有 ...

  4. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  5. 运用Mono.Cecil 反射读取.NET程序集元数据

    CLR自带的反射机智和API可以很轻松的读取.NET程序集信息,但是不能对程序集进行修改.CLR提供的是只读的API,但是开源项目Mono.Cecil不仅仅可以读取.NET程序集的元数据,还可以进行修 ...

  6. .NET面试题系列[6] - 反射

    反射 - 定义,实例与优化 在面试中,通常会考察反射的定义(操作元数据),可以用反射做什么(获得程序集及其各个部件),反射有什么使用场景(ORM,序列化,反序列化,值类型比较等).如果答得好,还可能会 ...

  7. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  8. C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射

    此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...

  9. [源码]Literacy 快速反射读写对象属性,字段

    Literacy 说明 Literacy使用IL指令生成方法委托,性能方面,在调用次数达到一定量的时候比反射高很多 当然,用IL指令生成一个方法也是有时间消耗的,所以在只使用一次或少数几次的情况,不但 ...

随机推荐

  1. Java设计模式(8)——策略模式

    一.策略模式定义 Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户 ...

  2. [C#.Net]判断文件是否被占用的两种方法

    今天开发产线测试Tool时发现日志文件会几率性的被占用,上网浏览找到最简单的代码(API或者FileStream),在这里抛砖引玉下. 第一种方法:API using System.IO; using ...

  3. 47.iOS跳转AppStore评分和发送邮件

    1.跳转到AppStore评分 应用地址是关键:IOS 设备,手机搜索应用,拷贝链接 NSString *appStr =@"https://itunes.apple.com/cn/app/ ...

  4. mybatis 使用merge into

    前一篇博客,oracle的merge into语法 : oracle merge into语法 mybatis 使用merge into,跟一般的update写法相同: <update id=& ...

  5. java.io.IOException: java.sql.SQLException: ORA-01502: index 'BTO.PK_xxxxx' or partition of such index is in unusable state

    最近由于数据库的全备出问题了,所以一直在观察. 刚好发现很多不需要的数据,就删了几百个G的数据吧. 今天突然就报这个问题. java.io.IOException: java.sql.SQLExcep ...

  6. fmt标签如何计算两个日期之间相隔的天数

    <h2>start -- ${start}</h2><h2>end -- ${end}</h2><fmt:formatDate var=" ...

  7. 2018.11.01 NOIP训练 图论(线段树+倍增+dfs序)

    传送门 一道挺妙的题. 对于询问点(u,v),如右图所示,我们可以发现存在一个点m在u->v的路径中,m子树的点到u是最近的,m子树外到v是最近的.其中dis(u,m)=(dis(u,v)-1) ...

  8. 使用express框架和mongoose在MongoDB删除数据

    使用remove()删除数据 remove({},function(err,doc){})  // 删除所有数据 remove({age:18},function(err,doc){}); //删除指 ...

  9. oracle数据库的迁移(从一台服务器到另一个台服务器,从oracle 10g到oracle 11g)

    这个过程呢,还是蛮艰难的.... 一.最初我使用的是Navicat中的数据传输来迁移的,虽说整个数据库的迁移没有成功,但传输指定的对象时还是传输成功了.所以还是记录一下吧. 1.前提连接好数据库.在指 ...

  10. linux source命令的用法

    source命令用法:source FileName作用:在当前bash环境下读取并执行FileName中的命令.(如把ls写入a.txt,然后source a.txt 就会执行ls命令,列出目录)注 ...