####反射预备知识一###########

__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反射的更多相关文章

  1. 【C#学习笔记】反射的简单用法

    常见的使用反射的场景: 程序在运行时动态地访问类的成员,如获得类的变量.方法. 例如:用反射给本类的变量赋值. public class Student{ public string studentN ...

  2. java学习笔记:反射

    1.什么是反射? Reflection(反射)是被视为动态语言的关键,反射机制允许程序做执行期间借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象内部属性及方法 2.反射相关的 ...

  3. 【java学习笔记】反射基础

    一.反射 反射就是在剖析一个类,了解这个类的构造,创建这个类对应的对象. Class 代表字节码的类,代表类的类 Field 代表属性的类 Method 代表方法的类 Constructor 代表构造 ...

  4. python学习笔记__反射

    反射 # 通过字符串的形式对对象中的成员进行操作(获取/查找/添加/删除). 操作的内置函数: 1.获取   getattr(object, name) # 去对象object中获取name的内容 c ...

  5. 8.2(java学习笔记)反射

    一.基础知识 对象是表示或封装一些数据,一个类被加载后JVM会创建一个对应该类的Class对象, 类的整个结构信息会被放在对应的对象中,通过这个对象我们可以获取改类的全部信息, 而这些操作称为反射. ...

  6. JavaSE 学习笔记之反射技术(二十四)

    反射技术:其实就是动态加载一个指定的类,并获取该类中的所有的内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员.简单说:反射技术可以对一个类进行解剖. 反射的好 ...

  7. python 3.x 学习笔记12 (反射 and 异常)

    1.反射通过字符串映射或修改程序运行时的状态.属性.方法 getattr(obj,name_str):  根据字符串name_str去获取obj对象里的对应的方法的内存地址 hasttr(obj,na ...

  8. Java 学习笔记(15)——反射

    Java中的类文件最终会被编译为.class 文件,也就是Java字节码.这个字节码中会存储Java 类的相关信息.在JVM执行这些代码时首先根据 java 命令中指定的类名找到.class 文件然后 ...

  9. java学习笔记之反射—反射和工厂模式

    简单工厂模式又称为静态工厂方法模式,它是由工厂对象来决定要创建哪一种类的实例化对象. 静态工厂代码: class Factory{ private Factory() {} public static ...

随机推荐

  1. MySql5.5安装步骤及MySql_Front视图配置

    一.下载文件 有需要的朋友,请自行到百度云下载 链接:https://pan.baidu.com/s/13Cf1VohMz_a0czBI05UqJg 提取码:cmyq 二.安装MySql 2.1.运行 ...

  2. Open Source v.s. Open Core

    摘要 本文翻译自 CMSWire 网站的<Open Source vs. Open Core: What's the Difference?>,主要介绍 Open Source 和 Ope ...

  3. Web应用程序并发问题处理的一点小经验

    在web应用中,一个账户,会有N多个涉及到数字的字段.比如一个账户的金额,积分等.这些字段就涉及到增减的情况.如果是在测试环境下,靠程序员或者测试手动点击.一般是发现不了问题. 一旦上到正式环境下.有 ...

  4. 各种xml配置文件(所含内部标签及顺序)的提示功能是真的人性化

    通过mybatis generator的配置文件来举例,其他配置文件(web.xml,mybatis,spring,springmvc等)同理 mybatis可以通过mybatis generator ...

  5. 02-22 决策树C4.5算法

    目录 决策树C4.5算法 一.决策树C4.5算法学习目标 二.决策树C4.5算法详解 2.1 连续特征值离散化 2.2 信息增益比 2.3 剪枝 2.4 特征值加权 三.决策树C4.5算法流程 3.1 ...

  6. Flutter 的setState与FutureBuilder及EasyRefresh示例

    用setState改变状态 class CpwsList extends StatefulWidget { _CpwsListState createState() => _CpwsListSt ...

  7. Kafka 介绍

    Apache Kafka是一个分布式流式平台. 流平台有三个关键的能力: 发布和订阅记录流,类似于消息队列或企业消息传递系统. 使用容错耐用的方式存储记录流. 记录产生时处理数据. Kafka主要是用 ...

  8. redis系列之------数据库

    前言 当我们在Redis数据库中set一个KV的时候,这个KV保存在哪里?如果我们get的时候,又从哪里get出来.时间复杂度,空间复杂的等等,怎么优化等等一系列问题. 服务器中的数据库 Redis服 ...

  9. 【前端词典】几个有益的 CSS 小知识

    今天偷个懒,不长篇大论,分享几个你可能不知道的 CSS 小知识. 样式的顺序 CSS 代码:   HTML 代码:   记得之前这是一道比较火的 CSS 考题,当时好像是有不少的人答错(30% 以上) ...

  10. PHP in_array

    1.函数的作用:判读一个元素是否在一个数组存在 2.函数的参数: @param mixed $needle @param array $array 3. if it’s ok to use isset ...