python 0o-377 -0o377_Python : 反射
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 : 反射相关推荐
- python元类、反射及双线方法
元类 print(type('abc')) print(type(True)) print(type(100)) print(type([1, 2, 3])) print(type({'name': ...
- Python 学习笔记: 反射
Python 反射应用 例子1: class Person:def __init__(self, name, age):self.name = nameself.age = agedef show(s ...
- Python基础入门:反射
反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去某个对象中寻找成员 根据字符串的形式去某个对象中设置成员 根据字符串的形式去某个对象中删除成员 根据字符串的形式去某个对象中判断成员 ...
- python(7)– 类的反射
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- python的自省与反射
1.反射自省的概念 自省:自省就是能够获得自身的结构和方法,给开发者可以灵活的调用,给定一个对象,返回该对象的所有属性和函数列表,或给定对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例 反 ...
- python getattr_python 知识点:反射 之 getattr()实现以字符串形式导入模块和执行函数...
# -*- coding: utf-8 -*- #知识点:反射 #通过字符串的形式去导入模块,这就是反射 #并以字符串的形式执行函数 #先看简单的小粒子 temp = 'mysql' #这个字符串是模 ...
- python getattr用法_python 反射之getattr用法
In [1]: models import CompanyTenant # 导入模型表In [2]: tenant = getattr(CompanyTenant,'tenant_id','') # ...
- python常用内置函数总结-python常用内置函数整理—反射
函数是组织好的,能够重复使用的,用来实现单一,或相关联功能的代码段.python提供了许多内建函数,这些函数提高了应用的模块性,和代码的重复利用率.下面是小编整理的python内建函数中的反射类,希望 ...
- day25 Python四个可以实现自省的函数,反射
python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 四个可以实现自省的函数 下列方法适用于类和对象(一切皆对象,类本身也是一个对象) ...
最新文章
- 找不到第三方怎么理赔_车子被撞,找不到肇事者怎么办?
- linux搭建vsftpd虚拟用户访问
- python递归详解_python基于递归解决背包问题详解
- Quartz 框架快速入门(四)
- 使用第三方插件,对office,PDF 进行预览
- 网络知识:视频监控传输带宽与存储容量的计算方法
- MongoDB 5.0 来了,原生时序、版本化 API 新特性悉数登场
- 网格成就Web 2.0存储时代的路易XIV?
- PHP Yii开源框架入门学习(二)修改Yii网站访问路径
- 利用运动学实现导弹仿真飞行
- Excel两列数据对比,找出重复数据
- Word文档分栏操作释疑
- [POI2012]HUR-Warehouse Store(贪心,堆)
- 网易163邮箱配置-iOS、OS X邮箱客户端
- 内容领先地位无法撼动,腾讯音乐与环球续约将共建新厂牌
- 如何利用springboot快速搭建一个消息推送系统
- 判断手机设备是否支持5G无线频段
- GitHub上README.md编写教程(基本语法)
- redis,Spring Cache,Mango,ES
- Sublime Text 设置成中文版(完整教程)
热门文章
- 网络功能虚拟化(NFV)的作用—Vecloud微云
- mysql5.7+ 虚拟列,json使用初体验
- Leetcode 24. Swap Nodes in Pairs
- 执行目标文件引发的问题:syntax error: word unexpected (expe...
- Lintcode 408 解题思路及c++代码
- Pthread多线程编程之查看Pthread版本的方法
- 深度学习输入模式与适当的网络架构之间的对应关系
- 在简历中应用STAR法则
- 马走日poj java超时_简单搜索poj 2243(水
- vscode更改插件路径_用好这7个 VS Code 插件,效率蹭蹭涨!