Java是一门面向对象的语言。 每一个Class,可以有instance,可以有Class对象。Instance的作用是调用方法、获取属性的,而Class对象则是获取类有哪些属性、方法的。Class对象与instance结合,也可以完成对instance方法的调用等。Java中的绝大部分框架,都离不开发射。那么在Python中,是否也有类似机制呢?

1、根据instance获取Class对象

对于一个Class的instance,想要获取所属Class对象,可以这样:instance.__class__。 该方式也只是用于 Class。对于不是Class的instance的情况下,如果获取到它们的所属类型呢?

2、使用type(obj)获取某个对象的类型

该函数用于获取任意一个Python对象的类型。

参数

返回值

XxxClass instance

XxxClass object

XxxClass.instancemthod

XxxClass.staticMethod

XxxModule

Len,min

3、isinstance(obj, class)

可以用isinstance(obj, class)来判断实例与class的关系。如果返回True,代表obj是 class或者其子类的实例。

在Python中,一切都是对象,例如package,module,class,function,instance都是对象。在上面使用type可以获取判定是哪种类型的,但是如果我们程序中只是想要判定一个对象是否是哪种类型的,使用type并不方便。而使用isinstance则可以快速判定了。

例如:

importtypes

isinstance(obj, types.ModuleType)#判定是否是module

isinstance(obj, (types.ClassType,types.TypeType)) #判定是类

4、利用反射来获取属性、调用方法

利用反射来访问instance的属性,方法,前提是已知instance、要访问的属性或者方法的名称(name)。在Python中,这一切就变得简单了,通过内置函数getattr(obj,name) 就可以获取到一个Python对象任意属性方法。如果要获取一个属性,获取的就是属性值;如果要获取方法,获取到的是方法对象。要获取的方法、属性,如果没有会从父类找的。

就拿之前的一个例子来说明问题:

#!python#-*- coding: utf-8 -*-

classPerson(object):

id=''name= ''age= 3

#等同于Java中的,即构造器

def __init__(self, id, name, age):print("init a Person instance")

self.id=id

self.name=name

self.age=agedefshow(this):print(this)#print(this.toString())

#def toString(self):#return "id:{}, name:{}, age:{}".format(self.id, self.name, self.age)

#等同于Java中的toString

def __str__(self):#return self.toString()

return "id:{}, name:{}, age:{}".format(self.id, self.name, self.age)#等同于Java中的finalize方法,del 实例时调用

def __del__(self):print("finally a Person instance")

self.id=None

self.name=None

self.age=None

self=Nonedef __get__(self, name):print("invoke in __get__")print(self.__dict__)return 1111

def __getattr__(self, name):print("invoke in __getattr__")return 1111

'''def __getattribute__(self, name):

print("invoke in __getattribute__")

print(object.__getattribute__(self, name))

print("after invoke in __getattribute__")

return object.__getattribute__(self, name)'''

classStudent(Person):def __init__(self, id, name, age,email):print("invoke in Student __init__")

super(Student, self).__init__(id, name, age) #invoke Person#__init__

self.email =emaildef __getitem__(self, name):return self.__dict__[name] + "_suffix"

defshow(self):print("show in ......")print("__dict__:{}".format(self.__dict__))print("__class__:{}".format(self.__class__))print("isinstance(self, __class__):{}".format(isinstance(self, self.__class__)))print("type:{}".format(type(self)))print("show out ......")

@staticmethoddefs_show(o):

o.show();

下面是反射测试:

#!python#-*- coding: utf-8 -*-

'''from model import Person

print(dir(Person))

p1 = Person('0001', 'fjn', 20)

print(p1)

p1.show()

print(p1.name)

print(p1.xx)

del p1'''

importmodel

Student=model.Student

s= Student('0001', 'fjn', 20, 'fs1194361820@163.com')

s.show()print(s["email"])'''print(type(model))

print(type(Student))

print(type(Student.show))

print(type(Student.s_show))

print(type(len))

print(dir(Student))

print(isinstance(type(Student),type))

print(isinstance(type(model),type))'''showMethod= getattr(s,"show") #get show method object from object s

if(showMethod!=None):#apply(showMethod) # use apply invoke show method

showMethod() #invoke show method direct

print(getattr(s,"age"))importtypesprint(isinstance(Student, (types.TypeType,types.ClassType)))print(isinstance(s, types.InstanceType))importinspectprint(inspect.isclass(Student))

5、Python的反射工具:inspect

Python提供了一个inspect模块,它封装了上面的所有功能。官方文档参见:https://docs.python.org/2/library/inspect.html#。也可以通过pydoc来查看该模块。

这个工具提供了对象类型判定,成员获取,源码位置,运行时Stack,异常trace等功能,应该成为Python编程的强大助手。而这些功能大多数就是由上面的那些函数组合完成的。

python 0o-377 -0o377_Python : 反射相关推荐

  1. python元类、反射及双线方法

    元类 print(type('abc')) print(type(True)) print(type(100)) print(type([1, 2, 3])) print(type({'name': ...

  2. Python 学习笔记: 反射

    Python 反射应用 例子1: class Person:def __init__(self, name, age):self.name = nameself.age = agedef show(s ...

  3. Python基础入门:反射

    反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去某个对象中寻找成员 根据字符串的形式去某个对象中设置成员 根据字符串的形式去某个对象中删除成员 根据字符串的形式去某个对象中判断成员 ...

  4. python(7)– 类的反射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

  5. python的自省与反射

    1.反射自省的概念 自省:自省就是能够获得自身的结构和方法,给开发者可以灵活的调用,给定一个对象,返回该对象的所有属性和函数列表,或给定对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例 反 ...

  6. python getattr_python 知识点:反射 之 getattr()实现以字符串形式导入模块和执行函数...

    # -*- coding: utf-8 -*- #知识点:反射 #通过字符串的形式去导入模块,这就是反射 #并以字符串的形式执行函数 #先看简单的小粒子 temp = 'mysql' #这个字符串是模 ...

  7. python getattr用法_python 反射之getattr用法

    In [1]: models import CompanyTenant # 导入模型表In [2]: tenant = getattr(CompanyTenant,'tenant_id','') # ...

  8. python常用内置函数总结-python常用内置函数整理—反射

    函数是组织好的,能够重复使用的,用来实现单一,或相关联功能的代码段.python提供了许多内建函数,这些函数提高了应用的模块性,和代码的重复利用率.下面是小编整理的python内建函数中的反射类,希望 ...

  9. day25 Python四个可以实现自省的函数,反射

    python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) ...

最新文章

  1. 找不到第三方怎么理赔_车子被撞,找不到肇事者怎么办?
  2. linux搭建vsftpd虚拟用户访问
  3. python递归详解_python基于递归解决背包问题详解
  4. Quartz 框架快速入门(四)
  5. 使用第三方插件,对office,PDF 进行预览
  6. 网络知识:视频监控传输带宽与存储容量的计算方法
  7. MongoDB 5.0 来了,原生时序、版本化 API 新特性悉数登场
  8. 网格成就Web 2.0存储时代的路易XIV?
  9. PHP Yii开源框架入门学习(二)修改Yii网站访问路径
  10. 利用运动学实现导弹仿真飞行
  11. Excel两列数据对比,找出重复数据
  12. Word文档分栏操作释疑
  13. [POI2012]HUR-Warehouse Store(贪心,堆)
  14. 网易163邮箱配置-iOS、OS X邮箱客户端
  15. 内容领先地位无法撼动,腾讯音乐与环球续约将共建新厂牌
  16. 如何利用springboot快速搭建一个消息推送系统
  17. 判断手机设备是否支持5G无线频段
  18. GitHub上README.md编写教程(基本语法)
  19. redis,Spring Cache,Mango,ES
  20. Sublime Text 设置成中文版(完整教程)

热门文章

  1. 网络功能虚拟化(NFV)的作用—Vecloud微云
  2. mysql5.7+ 虚拟列,json使用初体验
  3. Leetcode 24. Swap Nodes in Pairs
  4. 执行目标文件引发的问题:syntax error: word unexpected (expe...
  5. Lintcode 408 解题思路及c++代码
  6. Pthread多线程编程之查看Pthread版本的方法
  7. 深度学习输入模式与适当的网络架构之间的对应关系
  8. 在简历中应用STAR法则
  9. 马走日poj java超时_简单搜索poj 2243(水
  10. vscode更改插件路径_用好这7个 VS Code 插件,效率蹭蹭涨!