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

__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. Go语言基础之net/http

    Go语言基础之net/http 2017年6月26日 Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现. net/http介绍 Go语言内置的net/http包提供了HT ...

  2. react16 路由按需加载、路由权限配置

    1. 路由按需加载: 不做按需加载,代码全部打包在bundle.js 文件里,首屏渲染很慢,项目文件较多,会出现1分钟加载的可能性. import React, { Component } from ...

  3. github仓库添加MIT许可

    俩种方法 1.新建仓库 直接在选择添加即可如下图: 2.为已创建仓库后添加MIT协议 直接在给工程根目录添加LICENSE文件提交即可,内容是 MIT License Copyright (c) 年份 ...

  4. 10月27日Java整理

    实验一:凯撒密码 import java.util.Scanner; //zhanxinwu,October,25,2016 public class Addmi { public static vo ...

  5. 聊聊面试-int和Integer的区别

    最近面试了很多候选人,发现很多人都不太重视基础,甚至连工作十几年,项目经验十几页的老程序员,框架学了一大堆,但是很多 Java 相关的基础知识却很多都答不上来.还有很多人会回答,只知道要用,但是从来不 ...

  6. Python3的编码整理总结

    python3在内存中是用unicode编码方式存储的,所以不能直接储存和传输,要转化为其他编码进行储存和传输. 字符串通过编码转换成字节码,字节码通过解码成为字符串 encode:str --> ...

  7. php 加入 unless 语法

    1. php 的版本 :PHP 7.3.0-dev (cli) (built: Mar 18 2018 00:28:55) ( NTS ) 2. unless 语法结构: unless($cond){ ...

  8. [CF722C] Destroying Array

    C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. [BZOJ1116] CLO

    1116: [POI2008]CLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1311  Solved: 709[Submit][Status] ...

  10. 【Java必修课】ArrayList与HashSet的contains方法性能比较(JMH性能测试)

    1 简介 在日常开发中,ArrayList和HashSet都是Java中很常用的集合类. ArrayList是List接口最常用的实现类: HashSet则是保存唯一元素Set的实现. 本文主要对两者 ...