• python学习——反射


    生成器、迭代器、装饰器、列表生成式、面向对象、反射、
    1.反射*****
    getattr
    v = getattr(obj,'func')#根据字符串(第二参数)为参数,去对象(第一参数)中寻找与之同名的成员
    2.什么后面可以加()?
    类()
    对象()--执行__call__
    函数()
    方法()
    以上所有都可以被调用。通过callable()来判断
    3.1issubclass
    检查第一个参数是否是第二个参数的子孙类
    
    
    class Base:
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    print(issubclass(Foo,Base))#检查第一个阐述是否是第二个参数的子孙类
    print(issubclass(Bar,Base))#检查第一个阐述是否是第二个参数的子孙类
    View Code


    3.2type
    获取当前对象是有哪个类创建的
    obj = Foo()
    print(obj,type(obj))#
    if type(obj) == Foo:
       print('obj是Foo类型')
    def func(*args):
       foo_counter = 0
       bar_counter = 0
       for item in args:
           if type(item) == Foo:
               foo_counter += 1
           elif type(item) == Bar:
               bar_counter += 1
       return foo_counter,bar_counter
    v1,v2 = func(Foo(),Bar(),Foo())
    print(v1,v2)

    3.3isinstance

    检查第一个参数(对象)是否是第二个参数(类)的实例
    obj = Foo()
    print(obj,isinstance(obj,Foo)) #检查第一个参数(对象)是否是第二个参数(类)的实例
    print(obj,isinstance(obj,Base)) #检查第一个参数(对象)是否是第二个参数(类)的实例
    obj = Base()
    print(obj,isinstance(obj,Foo)) #检查第一个参数(对象)是否是第二个参数(类)的实例
    print(obj,isinstance(obj,Base)) #检查第一个参数(对象)是否是第二个参数(类)的实例

    给你一个参数,判断对象是不是由某一个指定类 ————type——type(obj) == Foo
    给你一个参数,判断对象是不是由某一个指定类或父类 ————isinstance——isinstance(obj,Foo)

    4用科学的方法判断是方法还是函数
    def func():
       pass
    print(func)
    
    class Foo(object):
       def detail(self):
           pass
       @staticmethod
       def XXX():
          pass
    
    obj = Foo()
    print(obj.detail)
    print(Foo.XXX)
    print(obj.XXX)


    练习
    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('不知道')
    
    def func():
       pass
    print(func)
    
    class Foo(object):
      def detail(self):
           pass
       @staticmethod
       def XXX():
          pass
    
    check(func)
    
    obj = Foo()
    check(obj.detail)
    check(obj.XXX)


    练习
    class Foo(object):
        def f1(self):
            pass
        def f2(self):
            pass
        def f3(self):
            pass
    obj = Foo()
    Foo.f1(obj)#把f1当做函数
    obj = Foo()
    obj.f1()#把f1当做方法,自动传self值


    练习1
    class Foo(object):
        def f1(self):
            pass
        def f2(self):
            pass
        def f3(self):
            pass
        list_display = [f1,f2]
        def __init__(self):
            pass
    for item in Foo.list_display:
        item(123)#此时是个函数


    练习2
    class Foo(object):
        def f1(self):
            pass
        def f2(self):
            pass
        def f3(self):
            pass
        list_display = [f1,f2]
    
    obj = Foo()
    Foo.list_display.append(obj.f3)
    for item in Foo.list_display:
        print(item)

    5.方法和函数*
    称谓:
    类,方法
    外,函数
    到底方法函数?
    对象.xxx——>xxx就是方法
    类.xxx ——>xxx就是函数
    xxx ——>xxx就是函数
    打印查看:
    function
    method
    代码检查:
    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('不知道')























  • 相关阅读:
    ES集群性能调优链接汇总
    【转】dmesg 时间转换
    广师大笔记汉诺塔
    广师大python学习笔记求派的值
    155. 最小栈(c++)
    160. 相交链表(c++)
    论文 数据集总结
    论文阅读 总结 复习
    121. 买卖股票的最佳时机(c++)
    9. 回文数(c++)
  • 原文地址:https://www.cnblogs.com/bilx/p/11389044.html
Copyright © 2020-2023  润新知