zoukankan      html  css  js  c++  java
  • 反射

    一.issubclass/type/isinstance

      1.issubclass :检查第一个参数是否是第二个参数的子子孙孙类

    class Base:
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    print(issubclass(Bar,Foo))
    #结果:True

      2.type:获取当前对象是有那个类创建

    class Foo:
        pass
    obj = Foo()
    print(obj,type(obj))   #获取当前对象是有那个类创建.
    if type(obj ) ==Foo:
        print("obj是Foo类型")
    def func(*args):
        foo_count = 0
        bar_count = 0
        for item in args:
            if type(item) ==Foo:
                foo_count += 1
            elif type(item) ==Bar:
                bar_count += 1
        return foo_count,bar_count
    result = func(Foo(),Bar(),Foo())
    print(result)

      3.isinstance: 检查第一个参数(对象)是否是第二个参数的实例.

    class Base:
        pass
    class Foo(Base):
        pass
    obj1 = Foo()
    print(isinstance(obj1,Foo))   #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
    print(isinstance(obj1,Base))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
    obj2 = Base()
    print(isinstance(obj2,Foo))   #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
    print(isinstance(obj2,Base))  #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
    # 结果:True  True     False    True

    给一个参数,判断对象是不是由某一个指定类?    type

    type(obj) ==Foo

    给一个参数,判断対象是不是由某一个指定类或其父类?    instance(obj,Foo)

    二.方法和函数

      称谓:    类  ,  方法

          外  ,  函数

           对象.xxx   ==>  xxx就是方法

      类.XXX     ==>  xxx就是函数

      xxx           ==>   xxx就是函数

    打印查看:

      function:   函数

      mathod:    方法

    from types import MethodType,FunctionType
    def check(arg):
        """
        检查arg是方法还是函数
        :param arg:
        :return:
        """
        if isinstance(arg,MethodType):
            print("arg是一个方法")
        elif isinstance(arg,FunctionType):
            print("arg是一个函数")
        else:
            print("不知道")

    三.反射

    v = getattr(obj,"func")  根据字符串为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员.

    getattr:  根据字符串的形成,去对象中找成员.

    hasattr:  根据字符串的形成,去判断对象中是否有成员.

    setattr:   根据字符串的形成,动态的设置一个成员(内存)

    delattr:   根据字符串的形成, 动态的删除一个成员(内存)

    #handler.py
    f0 = 9
    def f1():
        print("F1")
    def f2():
        print("F2")
    def f3():
        print("F3")
    def f4():
        print("F4")
    def f5():
        print("F5")
    ############################
    from types import FunctionType
    import handler
    while True:
        print('''
         系统支持的函数有
         1.f1
         2.f2
         3.f3
         4.f4
         5.f5''')
        val = input("请输入要执行的函数:")
        if hasattr(handler,val):
            func_or_val = getattr(handler,val)
            if isinstance(func_or_val,FunctionType):
                func_or_val()
            else:
                print(func_or_val)
        else:
            print("handler中不存在输入的属性名")
  • 相关阅读:
    Eclipse检出原MyEclipse项目后 javax.servlet.http相关类都报错【我,体现着一类jar包问题的处理方法】
    Tomcat中加载不到项目 项目构建Deployment Assembly报错:The given project is not a virtual component project
    Unity手游之路<十一>资源打包Assetbundle
    Unity手游之路<十二>手游资源热更新策略探讨
    Unity手游之路<十三>手游代码更新策略探讨
    观察者(Observer)模式
    访问者(Visitor)模式
    设计模式(15)-Facade Pattern
    使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)
    思维导图快捷键
  • 原文地址:https://www.cnblogs.com/chenxi67/p/9561549.html
Copyright © 2011-2022 走看看