zoukankan      html  css  js  c++  java
  • day25

    1. isinstance/issubclass/type
    (1)issubclass: 检查第一个参数是否是第二个参数的 子子孙孙类
      示例:
        class Base(object):
            pass
    
        class Foo(Base):
            pass
    
        class Bar(Foo):
            pass
    
        # 检查第一个参数是否是第二个参数的 子子孙孙类
        print(issubclass(Bar, Base))  # True
    
    (2)type: 获取对象是由那个类?创建的
      示例1:
        class Foo:
            pass
    
        obj = Foo()
    
        print(obj, type(obj))  # 获取对象是由那个类创建的
        if type(obj) == Foo:
            print('obj是Foo类型')
    
      示例2:
        class Foo:
            pass
    
        class Bar:
            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)
    
    (3)isinstance: 检查第一个参数(对象)是否是第二个参数(类以及父类)的实例
      示例:
        class Base(object):
            pass
    
        class Foo(Base):
            pass
    
        obj1 = Foo()
        print(isinstance(obj1, Foo))  # T 检查obj1是否是Foo类或者Foo父类的实例
        print(isinstance(obj1, Base))  # T
    
        obj2 = Base()
        print(isinstance(obj2, Foo))  # F
        print(isinstance(obj2, Base))  # T
    
    """
    给你一个参数,判断对象是不是某一个指定的类?        type    --> type(obj) == Foo
    给你一个参数,判断对象是不是某一个指定的类或其父类? isinstance  --> isinstance(obj, Foo)
    """

    2. 方法和函数

    称谓:
        在类中,方法
        在外面,函数
        
    到底方法函数?
        对象.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('不知道是什么')

    3. 反射

    简单示例:
        class Foo(object):
    
            country = "中国"
    
            def func(self):
                pass
    
    
        v = getattr(Foo, 'func') # Foo.func # 根据字符串为参数, 去类中寻找与之同名的成员
        print(v)
    
        obj = Foo()
        v = getattr(obj, 'func') # obj.func # 根据字符串为参数, 去对象中寻找与之同名的成员
        print(v)
    
      总结: v
    = getattr(obj, 'func') # obj.func # 根据字符串为参数(第二个参数), 去对象(第一个参数)中寻找与之同名的成员 应用一:(模块级别) # 模块handler中有 f1-f5,调用之后分别打印 F1-F5. from types import FunctionType import handler while 1: print(""" 系统支持的函数有: 1. F1 2. F2 3. F3 4. F4 5. F5 """) val = input("请输入要执行的函数:") # val = 'f1' # 错误 # handler.val() if hasattr(handler, val): # hasattr 判断一个对象里面是否有name属性或者方法,返回bool值 func_or_val = getattr(handler, val) # 根据字符串为参数, 去模块中寻找与之同名的成员 if isinstance(func_or_val, FunctionType): func_or_val() else: print(func_or_val) else: print('handler中不存在输入的属性名') # 正确的方式 """ if val == 'f1': handler.f1() elif val == 'f2': handler.f2() elif val == 'f3': handler.f3() elif val == 'f4': handler.f4() elif val == 'f5': handler.f5() """ 应用二:(面向对象级别) 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()
    """
    getattr()  # 根据字符串的形式, 去对象中找该成员
    hasattr()  # 根据字符串的形式, 去判断对象中是否有该成员
    setattr()  # 根据字符串的形式, 去对象中动态的设置一个成员(内存)
    delattr()  # 根据字符串的形式, 去对象中动态的删除一个成员(内存)
    """
    # 反射补充
        xx文件
        ------------------
        x1 = 123
    
        def f1(arg):
            print(arg, 666)
        --------------------
        import xx
        
        # getattr: 根据字符串的形式, 去对象中找该成员
        v1 = getattr(xx, 'x1')
        v2 = getattr(xx, 'f1')  # 找到xx模块中的f1函数,并把函数名赋值给v1
        v2('杨森')  # 传参调用
        
        # hasattr: 根据字符串的形式, 去判断对象中是否有该成员,返回bool值
        v3 = hasattr(xx, 'x1')
        v4 = hasattr(xx, 'f1')
        v5 = hasattr(xx, 'xxxxxxx')
        print(v3, v4, v5)  # T T F
        
        # setattr: 根据字符串的形式, 去对象中动态的设置一个成员(内存)
        setattr(xx, 'x2', 999)  # 在内存设置了一个值 x2 = 999
        v6 = getattr(xx, 'x2')
        print(v6)  # 999
        
        setattr(xx, 'f2', lambda x: x+1)  # 在内存中设置了一个f2函数
        v7 = getattr(xx, 'f2')
        v8 = v7(1)
        print(v8)  # 2
    
        # delattr
        delattr(xx, 'x1')  # 在内存中删除了
        v9 = getattr(xx, 'x1')  # 报错: 模块'xx'中没有成员'x1'
    
    # 反射补充-类
      示例:
            class Foo(object):
        
            def __init__(self, a1):
                self.a1 = a1
        
        obj = Foo(1)
        
        v1 = getattr(obj, 'a1')
        print(v1)  # 1
        
        setattr(obj, 'a2', 2)  # 在内存中为类设置一个类变量 a2 = 2
        v2 = getattr(obj, 'a2')
        print(v2)  # 2
        
        print(hasattr(obj, 'a1'))  # T 对象中是否存在成员a1
        
        delattr(obj, 'a1')  # 从内存中删除了a1
        v3 = getattr(obj, 'a1')  # 报错: 'Foo'对象没有'a1'

    4. 补充一个小东西

    # 问题:你见过的什么后面可以加()?
        - 类()
        - 对象()  执行__call__方法
        - 函数()
        - 方法()
        以上所有都可以被调用。
    
    示例:
        def func():
            pass
    
    
        class Foo(object):
            def __call__(self, *args, **kwargs):
                pass
            def func(self):
                pass
    
        obj = Foo()
        
        # callable 判断是否可以被调用,返回bool值
        print(callable(func))  # 函数
        print(callable(Foo))  #
        print(callable(obj))  # 对象
        print(callable(obj.func))  # 方法
    
    
    
  • 相关阅读:
    Git 初识
    AJAX
    vue router 如何使用params query传参,以及有什么区别
    【javascript语言精粹】第六章 数组
    【js语言精粹】第四章 函数
    【js高级程序设计】迭代器
    【js高级程序设计】第三章
    [js高级程序设计]第二章
    csrf攻击
    js 排序算法总结
  • 原文地址:https://www.cnblogs.com/kangqi452/p/11587209.html
Copyright © 2011-2022 走看看