• 反射 19


     一  issubclass , type , isinstance 

      1.issubclass 判断xxx类是否是xxxx类的子类

    class Base:
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    print(issubclass(Bar,Foo)) # True  判断Bar是不是Foo的子类 前者继承后者,是
    print(issubclass(Foo,Bar)) # False  前者被后者继承 返回值是False
    print(issubclass(Bar,Base)) # True 前者继承 继承的继承 因此是True

      2.type 给出 xxx 的数据类型  比较精准的给出对象的类

      type type(obj) 表示查看obj是由哪个类创建的

    class Foo:
        pass
    obj = Foo()
    print(obj,type(obj)) #<__main__.Foo object at 0x00000289C760D198> <class '__main__.Foo'>

    前边的表示由Foo创建的一个具体的对象所在的内存地址  后者表示obj 属于Foo类.(给出创建这个对象的类可以精准判断,这点有别于isinstance)

    3.isinstance  迭代器  判断xxx对象是否是xxxx类型的   子类的对象可以当成父类的类型 (不能往下判断 即父类对象当成子类的类型)

    class Base:
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    print(isinstance(Foo(),Foo)) # True 自己属于自己的类型
    print(isinstance(Foo(),Base)) # True 继承了Base 因此属于Base类型
    print(isinstance(Foo(),Bar)) # False 不能往下判断

    # 实例方法: 对象.方法   方法   类名.方法

    二 区分函数和方法(不太重要):

      在外面定义的函数一定是函数

      在类中:

         1.实例方法: 如果是对象访问 那么就是方法 如果是类访问 , 那么就是函数

         2. 静态方法 : 都是函数

         3. 类方法 : 都是方法

      如果想要用程序来判断. 需要引入两个模块 

        from types import FunctionType , MethodType

        isinstance(obj , FunctionType)  返回True 或者False

    三 反射(重点)

      正常是先引入模块,然后去访问模块里的内容,现在反了 手动输入要运行的功能,反着去模块里找,这个就是反射.

      仅限于内存层面   并不会影响源代码 如果想改,可以使用文件操作进行修改

      hasattr(obj,str) 判断对象中是否包含了 xxx(str)

      getattr(obj,str) 从对象中获取xxxx(str)

      

      setattr(obj,str,value) 给对象设置xxx(str)属性值(value)

      delattr(obj,str) 从对象中删除xxxx(str)信息

          

      

  • 相关阅读:
    BZOJ2243: [SDOI2011]染色
    BZOJ1036: [ZJOI2008]树的统计Count
    转自 x_x_的百度空间 搞ACM的你伤不起
    wcf test client
    wcf test client
    log4net编译后命名空间找不到的问题
    log4net编译后命名空间找不到的问题
    Hive Getting Started
    Hive Getting Started
    刚听完CSDN总裁蒋涛先生的学术报告
  • 原文地址:https://www.cnblogs.com/f-g-f/p/9721200.html
Copyright © 2020-2023  润新知