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

__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  

  

最新文章

  1. 理解Docker(5):Docker 网络
  2. Socket通信类
  3. bash的管道符与重定向
  4. Gym - 101102C
  5. [LeetCode] Reverse Linked List
  6. 关于自定义Dialog的一次折腾
  7. python使用SMTP发送邮件
  8. linux命令之crontab详解
  9. 使用WinDBG调试查看C#内存转储文件
  10. jquery validate 动态增加删除验证规则(转载)
  11. Rancher学习笔记-----1.分享链接
  12. ORA-03137: TTC 协议内部错误: [12333] [4] [49] [51] [] [] [] []
  13. WebService发布到IIS
  14. Oracle性能优化2- 依据场景选择技术
  15. 定时任务起的java进程没有释放导致oracle的问题not availavle &amp; out of memory
  16. 《mysql必知必会》学习_第六章_20180730_欢
  17. QTP Test ,VAPI-XP Test,LR Test 和ALM 集成远程分布式执行遇到的&ldquo;access is denied &rdquo; &ldquo;unspecified error&rdquo;问题
  18. StormUI详解
  19. 【Java面试题】28 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
  20. [转]How do I run msbuild from the command line using Windows SDK 7.1?

热门文章

  1. Video/audio标签的一些基础使用心得
  2. Linux 下复制整个文件夹的命令
  3. C# 获取顶级(一级)域名方法
  4. GUI tkinter (pack、grid、place)布局篇
  5. 在SRAM、FLASH中调试代码的配置方法(附详细步骤)
  6. procdump64+mimikatz获取win用户hash密码
  7. CDN实现原理
  8. 一个关于内联优化和调用约定的Bug
  9. Mysql高手系列 - 第26篇:聊聊如何使用mysql实现分布式锁
  10. Leetcode(2)两数相加