• 面向对象的反射和其他


    1.issubclass/type/isinstance/

    class Base(object):
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    #   issubclass  判断是否是继承关系,
    print(issubclass(Bar, Base))     #判断第一个参数是不是第二个参数的子孙类
    print(issubclass(Foo, Bar))
    issubclass
    class Foo(object):
        pass
    obj = Foo()
    print(obj, type(obj))   #获取当前对象是由那个类创建的
    if type(obj) == Foo:
        print('obj是类Foo创建的对象')
    结果:
    <__main__.Foo object at 0x032ADCF0> <class '__main__.Foo'>
    obj是类Foo创建的对象
    
    class Foo(object):
        pass
    class Bar(object):
        pass
    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
    result = func(Foo(), Bar(), Foo())
    print(result)
    v1, v2 = func(Foo(), Bar(), Foo())
    print(v1, v2)
    结果:
    (2, 1)
    2 1
    type
    #isinstance  传两个参数,判断第一个参数(对象)是否是第二个参数(类及父类)的实例
    class Base(object):
        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))   #检查第一个参数(对象)是否是第二个参数(类及父类)的实例
    isinstance

      使用场景:type和isinstance

        type: 判断对象是不是由某一个指定的类创建    -->type(obj) == Foo

        isinstance:判断对象是不是由某一个指定的类或其父类创建  -->isinstance(obj,Foo)

    2.方法和函数

      称谓:

        类  方法

        外  函数

       判断到底是方法还是函数的方法,看怎么调用

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

          类.xxx      --> xxx就是函数

          xxx   --> xxx就是函数

       打印查看

          function  函数

          method  方法

    from types import MethodType,FunctionType
    def check(args):
        if isinstance(args, MethodType):
            print('args是一个方法')
        elif isinstance(args, FunctionType):
            print('args是一个函数')
        else:
            print('不知道是什么东西')
    
    def func():
        pass
    class Foo(object):
        def detail(self):
            pass
        @staticmethod
        def xxx():
            pass
    
    check(func)
    
    obj = Foo()
    check(obj.detail)
    check(obj.xxx)
    结果:
    args是一个函数
    args是一个方法
    args是一个函数
    导入types模块判断
    class Foo(object):
        def f1(self):
            pass
        def f2(self):
            pass
        def f3(self):
            pass
    obj = Foo()
    print(obj.f1)
    print(obj.f2)
    
    obj = Foo()
    Foo.f1(obj)     #把f1当做函数
    obj = Foo()
    obj.f1()        #把f1当做方法,自动传self值
    结果:
    <bound method Foo.f1 of <__main__.Foo object at 0x0030FDF0>>
    <bound method Foo.f2 of <__main__.Foo object at 0x0030FDF0>>
    打印查看

    3.反射

      getatter  #根据字符串的形式,去对象中找成员

      hasatter  #根据字符串的形式,判断对象中是否含有成员

      setatter  #根据字符串的形式,动态的设置一个成员(添加在内存中)

      delatter  #根据字符串的形式,动态的删除一个成员(在内存中删除)

    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中不存在输入的属性名.')
    通过反射判断并执行函数
    f0 = 9
    def f1():
        print('f1')
    def f2():
        print('f2')
    def f3():
        print('f3')
    def f4():
        print('f4')
    def f5():
        print('f5')
    handler
    class Account(object):
        func_list = ['login', 'logout', 'register'] #建立一个序号与方法的对应关系列表
        def login(self):
            '''
            登录
            :return:
            '''
            print('登录11')
        def logout(self):
            '''
            注销
            :return:
            '''
            print('注销11')
        def register(self):
            '''
            注册
            :return:
            '''
            print('注册11')
        def run(self):
            '''
            主代码
            :return:
            '''
            print('''
            请输入要执行的功能:
                1.登录
                2.注销
                3.注册''')
            choice = int(input('请输入要执行的序号:'))   #得到选择的方法序号
            func_name = Account.func_list[choice-1]     #通过列表索引得到方法名的字符串
            # func = getattr(Account, func_name)  #Account.login
            # func(self)        #通过类执行方法,自己传self
            func = getattr(self, func_name)             #在对象中找func_name对应的方法
            func()              #通过对象执行方法
    obj1 = Account()
    obj1.run()
    通过创建列表对应关系,执行方法

    可以被调用:

      类()

         对象()

      函数()

      方法()

    def func():
        pass
    class Foo(object):
        def __call__(self, *args, **kwargs):
            pass
        def func(self):
            pass
    obj = Foo()
    print(callable(func))
    print(callable(Foo))
    print(callable(obj))
    print(callable(obj.func))
    判断可调用
  • 相关阅读:
    Django models中的null和blank的区别
    微服务
    幂等性
    restful规范
    related_name
    数据库 引擎,数据类型,约束
    数据库 基本操作
    python 常见算法
    python if,循环的练习
    python数据类型、if判断语句
  • 原文地址:https://www.cnblogs.com/Virous1887/p/9560960.html
Copyright © 2020-2023  润新知