• 面向对象之反射


    一、三个内置函数issubclass、type、isinstance

    issubclass():传入两个参数,判断第一个参数是否是第二个参数的后代

    class Animals:
        pass
    class Cat(Animals):
        pass
    class Bosicat(Cat):
        pass
    print(issubclass(Cat, Animals))
    print(issubclass(Animals, Cat))
    print(issubclass(Bosicat, Animals))

    运行结果:

    True
    False
    True

    说明判断的是第一个参数是否是第二个参数的后代。

    type:

    对于list、dict这些数据类型都是类,type的作用是精准的给出对象的类

    class Foo:
    pass
    obj = Foo()
    print(obj, type(obj)) # 查看obj的类

    也可以在计算的时候判断这个类型是字符型或者浮点型

    def add(a, b):
        if (type(a) == int or type(a) == float) and (type(b) == int or type(b)== float):
            return a + b
        else:
            print("我要报错")

    isinstance也可以判断xxx是yyy类型的数据. 但是isinstance没有type那么精准.

    class Base:
        pass
    class Foo(Base):
        pass
    class Bar(Foo):
        pass
    print(isinstance(Foo(), Foo)) # True
    print(isinstance(Foo(), Base)) # True
    print(isinstance(Foo(), Bar)) # False

    isinstance可以判断该对象是否是xxx家族体系中的(只能往上判断)

    二、区分函数和方法

    1.打印一下

    1)类方法. 不论任何情况, 都是方法.
    2)静态方法, 不论任何情况. 都是函数
    3)实例方法, 如果是实例访问. 就是方法. 如果是类名访问就是函数

    2.⽤用程序来帮我们分辨。

    
    

    # 所有的方法都是MethodType的实例例
    # 所有的函数都是FunctionType的实例例


    from
    types import MethodType, FunctionType def func(): pass print(isinstance(func, FunctionType)) # True print(isinstance(func, MethodType)) # False class Foo: def chi(self): print("我是吃") @staticmethod def static_method(): pass @classmethod def class_method(cls): pass obj = Foo() print(type(obj.chi)) # method print(type(Foo.chi)) # function print(isinstance(obj.chi, MethodType)) # True print(isinstance(Foo.chi, FunctionType)) # True print(isinstance(Foo.static_method, FunctionType)) # True print(isinstance(Foo.static_method, MethodType)) # False print(isinstance(Foo.class_method, FunctionType)) # False print(isinstance(Foo.class_method, MethodType)) # True

    三、反射

    四个内置函数:

    1. hasattr(obj, str) 判断obj中是否包含str成员

    2. getattr(obj,str) 从obj中获取str成员

    3. setattr(obj, str, value) 把obj中的str成员设置成value. 注意. 这⾥里里的value可以是值, 也可以是函数或者⽅法

    4.delattr(obj, str) 把obj中的str成员删除掉

  • 相关阅读:
    递归汉诺塔问题
    递归求数组最大的那个数
    递归
    Overriding the Virtual Mechanism
    Shell中while循环的done 后接一个重定向<
    [转]【网络协议】TCP分段与UDP/IP分片 (MTU最大传输单元,MSS最大分段大小)
    vs2013一点事情
    深入理解JS中的变量作用域
    速效救心丸之django post 403
    速效救心丸之read
  • 原文地址:https://www.cnblogs.com/doit9825/p/13173232.html
Copyright © 2020-2023  润新知