zoukankan      html  css  js  c++  java
  • 反射及内置方法

    反射的概念

    可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射。

    反射有四种方法:

    hasattr:hasattr(object, name)判断一个对象是否有 name 属性或者 name 方法。有就返回 True,没有就返回 False

    getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr 和 getattr 配套使用

      需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()

    setattr:给对象的属性赋值,若属性不存在,先创建后赋值

    delattr:删除该对象指定的一个属性

    class Foo():
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def tell_info(self):
            print('%s: %s' %(self.name, self.age))
    
    obj = Foo("egon", 18)
    
    print(hasattr(obj, "name"))
    
    res1 = getattr(obj, "name")
    print(res1)
    res2 = getattr(obj, "xxx", None)
    print(res2)
    
    setattr(obj, "age", 38)
    print(obj.__dict__)
    setattr(obj, "gender", "male")
    print(obj.__dict__)
    
    delattr(obj, "name")
    print(obj.__dict__)
    反射

    isinstance 和 issubclass

    isinstance(obj, cls):检查 obj 是不是 cls 的对象(传两个参数,一个是对象,一个是类)

    issubclass(sub, super):检查 sub 是不是 super 的子类(传两个参数,一个是子类,一个是父类)

    class Foo:
        pass
    
    class Son(Foo):
        pass
    
    s = Son()
    print(isinstance(s, Son))   # 判断s是不是Son的对象
    print(type(s) is Son)
    print(isinstance(s, Foo))   # 判断s是不是Foo的对象  不精准
    print(type(s) is Foo)       # type比较精准
    
    print(issubclass(Son, Foo)) # 判断Son是不是Foo的子类
    print(issubclass(Son, object))
    print(issubclass(Foo, object))
    print(issubclass(int, object))
    View Code

    内置方法

    1、__str__ 和 __repr__:改变对象的字符串显示

    class Foo:
        def __init__(self, name):
            self.name = name
    
        def __repr__(self):
            return 'obj in str'  # 这里只能是return
        # def __str__(self):
        #     return '%s obj in str'%self.name
    
    f = Foo('egon')
    print(f)  # 优先执行__str__里面的内容
    # 那么你是不是觉得__repr__没用呢?
    # print('%s'%f)  #执行的是__str__里面的返回值
    # print('%r'%f)  #执行的是__repr__里面的返回值
    print('==============')
    print(str(f))  # 当执行str(f)时,会去找__str__这个方法,如果找不到的时候,__repr__这个方法就给替补了
    print(repr(f))
    # 1.当打印一个对象的时候,如果实现了__str__方法,打印__str__中的返回值
    # 2.当__str__没有被实现的时候,就会调用__repr__方法
    # 3.但是当你用字符串格式化的时候,%s和%r会分别调用__str__和__repr__方法
    # 4.不管是在字符串格式化的时候还是在打印对象的时候,__repr__方法都可以作为__str__方法的替补,但反之则不行
    # 5.用于友好的表示对象。如果__str__和__repr__方法你只能实现一个: 先实现__repr__
    View Code

    2、__del__:会在对象被删除时自动触发执行,用来在对象被删除前回收系统资源

    class Foo:
        def __del__(self):
            print('===>')
    
    obj=Foo()
    # del obj
    print('其他代码...')
    View Code
  • 相关阅读:
    LeetCode 25. Reverse Nodes in k-Group
    LeetCode 66. Plus One
    LeetCode 69. Sqrt(x)
    很认真的聊一聊程序员的自我修养
    LeetCode 24. Swap Nodes in Pairs
    unordered_map和map的区别
    子查询一定要注意,别忘记加TOP 1,不然就GG了,过了好久测试给我测出来了
    Tree 通过父id找所有子节点
    SqlSugar CURD
    什么是.NET Framwork
  • 原文地址:https://www.cnblogs.com/qiuxirufeng/p/9850891.html
Copyright © 2011-2022 走看看