• 学习笔记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  

      

  • 相关阅读:
    ARM 平台下的 SSHD 配置
    IISExpress 开放局域网访问
    qt5 交叉编译
    QT4 交叉编译
    make install 时指定安装路径
    linux 读取物理寄存器
    Windows 7 64bit Python 2 Install
    用eggjs返回xml格式数据,前端解析xml
    vue-cli项目中axios的配置文件
    webpack配置练习typescript的web项目
  • 原文地址:https://www.cnblogs.com/pylblog/p/8283612.html
Copyright © 2020-2023  润新知