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

    1. isinstance/issubclass/type  ***

    issubclass 判断xxx类是否是xxx类的子类

    class Animal:
    pass

    class Cat(Animal):
    pass

    class BoSiCat(Cat):
    pass
    print(issubclass(Cat, Animal)) # 判断第一个参数是否是第二个参数的后代
    print(issubclass(Animal, Cat))
    print(issubclass(BoSiCat, Animal)) # True

    type:给出xxx的数据类型 ,给出创建这个对象的类  比较精准的给出对象的类

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

    isinstance :检查第一个参数(对象)是否是第二个参数(类及父类)的类型

    class Animal:
    pass

    class Cat(Animal):
    pass

    class BoSiCat(Cat):
    pass

    a = Animal()
    print(isinstance(a, Animal)) # 自己类可以判断
    print(isinstance(a, Cat)) # 子类不能判断
    c = BoSiCat()
    print(isinstance(c, Animal)) # True 子类的对象可以当成父类的类型来看.
    # isinstance判断的是对象是否是xxx家族体系的内容. 往上找

      

    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. 反射   *****

        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中不存在输入的属性名')
    getattr
    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()
    实例2
    好记:
    getattr # 根据字符串的形式,去对象中找成员。*****
    hasattr # 根据字符串的形式,去判断对象中是否有成员。***
    setattr # 根据字符串的形式,动态的设置一个成员(内存)
    delattr # 根据字符串的形式,动态的删除一个成员(内存)


    总结:

    反射 *****
    issubclass/type/isinstance/ ***
    方法和函数 *

    问题:你见过的什么后面可以加()?
    - 类()
    - 对象()
    - 函数()
    - 方法()
    以上所有都可以被调用。

    示例:
    		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))
    			
    
    class Foo:
        # 实例方法: 对象.方法  方法    类名.方法  函数
        def chi(self):
            print("我是吃")
    
        @staticmethod # 都是函数
        def static_method():
            pass
    
        @classmethod # 都是方法
        def class_method(cls): # 类对象的内容
            pass
        @property # 神马都不是. 变量
        def age(self):
            return 10
    

      

  • 相关阅读:
    显示所有用户,mysql的基本操作
    创建用户的方法 3种mysql创建方法
    mysql在win系统dos 安装版配置步骤详解
    Docker学习(二) 数据卷(Volume)的使用
    Docker学习-私有仓库docker-registry的使用
    php 调用curl_init失败
    ubuntu 远程 window
    ubuntu 16.04服务器安装apache2 + php + mysql
    Git 的简单使用及ssh配置问题-赖大大
    python scrapy 爬取西刺代理ip(一基础篇)(ubuntu环境下) -赖大大
  • 原文地址:https://www.cnblogs.com/xihuanniya/p/9561761.html
Copyright © 2011-2022 走看看