zoukankan      html  css  js  c++  java
  • isinstance / issubclass / type, 方法和函数, 反射

    一.issubclass / type / isinstance

    issubclass: 检查第一个参数是否是第二个参数的子类或子类的子类

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

      

    type: 获取当前对象是由那个类创建

    class Foo(object):
        pass
    
    obj = Foo()
    
    print(obj, type(obj))
    if type(obj) == Foo:
        print('obj是Foo类型')
    

      

    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))
    

      

    二.方法和函数

    对象.xxx --> xxx就是方法
    类.xxx --> xxx就是函数
    xxx --> 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('不知道是什么')
    

      

      

    三.反射

    isinstance(getattr(), FunctionType)

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

    应用一:

    from types import FunctionType
    import handler  # 同目录的py文件
    
    while True:
        print("""
    		系统支持的函数有:
    			1. f1
    			2. f2
    			3. f3
    			4. f4
    			5. f5
    		""")
        val = input("请输入要执行的函数:")  # val = "f1"
    
        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()
    

      

  • 相关阅读:
    zuanwenzhang
    win32 打印机api
    错误码linux
    sed的一个知识点
    linux 修改时区
    赵鹏雁?、、
    Linux下模块编译错误
    Android加速度传感器实现“摇一摇”,带手机振动 .
    Android百度地图基础实现(标记+GPS) .
    Android 中 getApplicationContext()、this、getApplication()之间的区别 .
  • 原文地址:https://www.cnblogs.com/NachoLau/p/9556947.html
Copyright © 2011-2022 走看看