• 方法和函数,isinstance/issubclass/type以及反射


    一丶,isinstance/issubclass/type

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

    class Foo():
        pass
    class Boo(Foo):
        pass
    class Aoo(Boo):
        pass
    print(issubclass(Boo,Foo))      #True
    print(issubclass(Aoo,Foo))      #True

      2.type获取当前对象是由那个类创建。

    class Foo(object):
        pass
    
    obj = Foo()
    
    print(obj,type(obj))     #<__main__.Foo object at 0x000001B58F579D68> <class '__main__.Foo'>
    if type(obj) == Foo:
        print('obj是Foo类型')  #obj是Foo类型

      type练习

    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)   #(2, 1)
    
    v1,v2 = func(Foo(),Bar(),Foo())
    print(v1,v2)    #2 1
    type练习

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

      

     二丶方法和函数

       称谓:

        类,方法

        外,函数

      到底什么是方法,什么是函数?

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

        类.xxx    ---> xxx就是函数

        xxx  --->  xxx就是函数

      打印查看:

        function

        method

     

    代码演示:

    from types import MethodType,FunctionType
    class Foo:
        def display(self):
            pass
    def check(arg):
        """
        检查arg是方法还是函数?
        :param arg:
        :return:
        """
        if isinstance(arg,MethodType):
            print('arg是一个方法')
        elif isinstance(arg,FunctionType):
            print('arg是一个函数')
            
        else:
            print('不知道是什么')
    check(check)        #arg是一个函数
    obj = Foo()
    check(obj.display)      #arg是一个方法

    三丶反射 

      1.getattr : 根据字符串的形式,去对象中找成员

    class Foo(object):
    
        country = "中国"
    
        def func(self):
            pass
    v = getattr(Foo,'func') # Foo.func # 根据字符串为参数,去类中寻找与之同名的成员。
    print(v)    #<function Foo.func at 0x000001E1A557D8C8>
    
    obj = Foo()
    v = getattr(obj,"func") # obj.func # 根据字符串为参数,去对象中寻找与之同名的成员。
    print(v)    #<bound method Foo.func of <__main__.Foo object at 0x000001E1A5579F28>>

      2.hasattr : 根据字符串的形式,去判断对象中是否有成员.

    a = 123
    class Foo(object):
        country = "中国"
        def func(self):
            pass
    v2 = hasattr(Foo,"a")       #判断Foo中是否有a成员
    v3 = hasattr(Foo,'country') #判断Foo中是否有country成员
    v4 = hasattr(Foo,"func")    #判断Foo中是否有func成员
    v5 = hasattr(Foo,'xxxxxxx')
    
    print(v2,v3,v4,v5)    # False True True False

      3.setattr : 根据字符串的形式,动态的设置一个成员(内存)

    # 根据字符串的形式,动态的设置一个成员(内存)
    x1 = 123
    class Foo:
        def f1(arg):
            print(arg,666)
    
    setattr(Foo,'x2',999)
    v1 = getattr(Foo,'x2')
    print(v1)   #999

      4.根据字符串的形式,动态的删除一个成员(内存)

    x1 = 123
    class Foo:
        def f1(arg):
            print(arg,666)
    delattr(Foo,'x1')
    v9 = getattr(Foo,'x1')
    print(v9)

      应用

    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(self, func_name)  # self.login
            func()
    
    obj1 = Account()
    obj1.run()
    
    obj2 = Account()
    obj2.run()
    应用

     四丶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))
  • 相关阅读:
    ViewPager 滑动页(一)
    Fragment中Button的android:onClick 无法监听相应
    Button的四种Click响应方法
    环形图 自定义(一)
    Progress 自定义(一)-shape
    Button 自定义(一)-shape
    客户机页表遍历
    KVM的ept机制
    linux内核源码中两个重要的宏
    总结
  • 原文地址:https://www.cnblogs.com/qicun/p/9561013.html
Copyright © 2020-2023  润新知