zoukankan      html  css  js  c++  java
  • isinstance/issubclass/type 方法和函数 反射 ps:补充一点小知识

    一丶 issubclass   /  type   /  isinstance 

    1.issubclass

    检查第一个参数是否是第二个参数的 子子孙孙类

    class Base(object):
        pass
    
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    
    print(issubclass(Bar,Base))

    2.type

    获取当前对象时由哪一个类创建

    class Foo(object):
        pass
    
    obj = Foo()
    
    print(obj,type(obj)) # 获取当前对象是由那个类创建。
        if type(obj) == Foo:
                print('obj是Foo类型')
        
          

    3.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)) # 检查第一个参数(对象)是否是第二个参数(类及父类)的实例。

    二丶方法和函数

    代码检测是方法还是函数,方法还是函数取决于调用方

    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('不知道是什么')
                                            

    三丶反射

    含义用法:

    getattr # 根据字符串的形式,去对象中找成员。
    hasattr # 根据字符串的形式,去判断对象中是否有成员。
    setattr # 根据字符串的形式,动态的设置一个成员(内存)
    delattr # 根据字符串的形式,动态的删除一个成员(内存)

    应用一
    from types import FunctionType
    import handler
    
    while True:
        print("""
        系统支持的函数有:
            1. f1
            2. f2
            3. f3
            4. f4
            5. f5
        """)
        val = input("请输入要执行的函数:") # val = "f1"
    
        # 错误
        # handler.val()
        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中不存在输入的属性名')

     应用二 

    class Account(object):
        func_list = ['login', 'logout', 'register']
    
        def login(self):
            """
            登录
            :return:
            """
            print('登录111')
    
        def logout(self):
            """
            注销
            :return:
            """
            print('注销111')
    
        def register(self):
            """
            注册
            :return:
            """
            print('注册111')
    
        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)
    
            func = getattr(self, func_name)  # self.login
            func()
    
    obj1 = Account()
    obj1.run()
    
    obj2 = Account()
    obj2.run()

    ps: 补充

    callable判断后面括号的内容是不是可以被调用的

    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))
     
  • 相关阅读:
    搜索表头的例子-jqueryEasyUi
    Class^=,Class*= ,Class$=含义(转)
    js中slice方法(转)
    java中File的delete和deleteOnExit区别(转)
    BeanUtils.populate的方法的作用
    java NIO编程(转)
    java socket 之UDP编程
    彻底理解ThreadLocal(转)
    @RequestBody, @ResponseBody 注解详解(转)
    Spring MVC之@RequestMapping 详解
  • 原文地址:https://www.cnblogs.com/xintiao-/p/9561621.html
Copyright © 2011-2022 走看看