学习笔记63_python反射
####反射预备知识一###########
__call__ 对象后面加括号,触发执行。
python中,类的默认的内置方法,有一个名为__call__,如
class foo:
def __init__(self):
pass
def __call__(self,*args,**kwargs)
print '__call__'
调用:
obj = Foo() #执行'__init__'
obj()'#执行__call__'
####反射预备知识二###########
在python中,obj是通过Foo类实例化的对象,
其实,不仅 obj 是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。
如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的 构造方法 创建。
证据:
print type(obj) #输出<class 'Demo.foo'> 表示,obj对象由类Foo类创建
print type(Foo) #输出<type 'type'> 表示,Foo类对象 由Type类创建
####反射预备知识三###########
类的特殊创建方式:
def func(self):
#todo
def __init__(self ,name,age):
self.name = name
self.age= age
Foo = type('Foo',{object,},{'func':func,'__init__':__init__})
调用:
obj = Foo("aaa",22)
obj.func()
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员
类 是由 type 类实例化产生
####反射预备知识三###########
Type类型猜想:
class MyType(type):
def __init__(self,what,bases=None,dict=None): #类名,基类,类成员
super(MyType,self).__init__(what,bases,dict)
def __call_(self,*args,**kwargs)
obj = self.__new__(self,*args,**kwargs)
self.__init__(obj)
class Foo(object):
__metaclass__=MyTpe #内置内属性,指定其 元 类
def __init__(self,name):
self.nam =name
def __new__(cls,*arg,**kwargs):
return object.__new__(cls,*args,**kwargs)
那么,在使用 obj =Foo(),时,将发生以下反应:
1. MyType使用 自己的__init__方法,产生 Foo类
2. 根据Foo(),在Type看来,Foo类也是一个对象,根据 “ 反射预备知识一” 可知,使用Foo(),相当于
执行__call__()
3.__call__中,又执行了Foo类的__new__ 和 __init__ ,以达到创建对象的目的
####反射预备知识四###########
# #### 检查是否含有成员 ####
hasattr(obj, 'name')
hasattr(obj, 'func') # #### 获取成员 ####
getattr(obj, 'name')
getattr(obj, 'func') # #### 设置成员 ####
setattr(obj, 'age', 18)
setattr(obj, 'show', lambda num: num + 1) # #### 删除成员 ####
delattr(obj, 'name')
delattr(obj, 'func')
反射:
1.获取某个目录下的所有.py文件名
2.使用 f = __import__("import_lib.fileName") *注意,Python中,一切皆对象,连模块都是对象
3. if hasattr(f, '根据约定的接口类名(例如:PlugIn)') : #假如Plugin是由url中截取到的话,就是对应的页面模块了
PlugIn = getattr(f,"PlugIn")
instance = Plugin()
#todo
学习笔记63_python反射的更多相关文章
- 【C#学习笔记】反射的简单用法
常见的使用反射的场景: 程序在运行时动态地访问类的成员,如获得类的变量.方法. 例如:用反射给本类的变量赋值. public class Student{ public string studentN ...
- java学习笔记:反射
1.什么是反射? Reflection(反射)是被视为动态语言的关键,反射机制允许程序做执行期间借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象内部属性及方法 2.反射相关的 ...
- 【java学习笔记】反射基础
一.反射 反射就是在剖析一个类,了解这个类的构造,创建这个类对应的对象. Class 代表字节码的类,代表类的类 Field 代表属性的类 Method 代表方法的类 Constructor 代表构造 ...
- python学习笔记__反射
反射 # 通过字符串的形式对对象中的成员进行操作(获取/查找/添加/删除). 操作的内置函数: 1.获取 getattr(object, name) # 去对象object中获取name的内容 c ...
- 8.2(java学习笔记)反射
一.基础知识 对象是表示或封装一些数据,一个类被加载后JVM会创建一个对应该类的Class对象, 类的整个结构信息会被放在对应的对象中,通过这个对象我们可以获取改类的全部信息, 而这些操作称为反射. ...
- JavaSE 学习笔记之反射技术(二十四)
反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好 ...
- python 3.x 学习笔记12 (反射 and 异常)
1.反射通过字符串映射或修改程序运行时的状态.属性.方法 getattr(obj,name_str): 根据字符串name_str去获取obj对象里的对应的方法的内存地址 hasttr(obj,na ...
- Java 学习笔记(15)——反射
Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...
- java学习笔记之反射—反射和工厂模式
简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象. 静态工厂代码: class Factory{ private Factory() {} public static ...
随机推荐
- redis查找大key
redis中查找出比较大的key 下面直接上代码 (请在测试机上测试) #!/usr/bin/env python import sys import redis def check_big_key( ...
- Java匹马行天下之教你用学汉语式方法学编程语言
Java匹马行天下之教你用学汉语式方法学编程语言 前言: 前段时间接连更新了带小白从入门到了解的几篇博客: <Java匹马行天下之编程常识知多少> <Java匹马行天下之走进编程的殿 ...
- Java 爬虫遇上数据异步加载,试试这两种办法!
这是 Java 爬虫系列博文的第三篇,在上一篇 Java 爬虫遇到需要登录的网站,该怎么办? 中,我们简单的讲解了爬虫时遇到登录问题的解决办法,在这篇文章中我们一起来聊一聊爬虫时遇到数据异步加载的问题 ...
- 【Java】获取当前操作系统桌面路径
//当前用户桌面 File desktopDir = FileSystemView.getFileSystemView() .getHomeDirectory(); String desktopPat ...
- ES6——箭头函数与普通函数的区别
ES6标准新增了一种新的函数:Arrow Function(箭头函数). 为什么叫Arrow Function?因为它的定义用的就是一个箭头: 语法: //1.没有形参的时候 let fun = () ...
- C# 动态(不定)类型和不定参数数量,使用param写入CSV文档的最简单方法,提供excel(或记事本)阅读支持格式
在开发一个项目,使用C#写入CSV文件时,虽并未遇到太多阻碍,但是很多小伙伴估计和我有过同样的想法.简单的写入CSV,固定参数数量就好了很简单写完.但是如果遇到你得到的数据参数数量和参数类型未知或者动 ...
- Redis 的底层数据结构(整数集合)
当一个集合中只包含整数,并且元素的个数不是很多的话,redis 会用整数集合作为底层存储,它的一个优点就是可以节省很多内存,虽然字典结构的效率很高,但是它的实现结构相对复杂并且会分配较多的内存空间. ...
- Linux快速入门
一.Linux介绍 1.Linux是基于Unix的开源免费的操作系统 2.Linux的分类: (1)Linux根据市场需求不同,基本分为两个方向: 1)图形化界面版:注重用户体验,类似window操作 ...
- 深入理解 web 协议(一)- http 包体传输
本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/WlT8070LlrnSODFRDwZsUQ作者:吴越 开坑这个系列的原因,主要是在大前端学习的 ...
- DJango错误日志生成
DJango错误日志生成 setting.py设置 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'formatters': ...