美文网首页
8.自省反射 和 类内置方法

8.自省反射 和 类内置方法

作者: 芝麻酱的简书 | 来源:发表于2018-08-17 11:54 被阅读18次

反射四个方法的使用:

hasattr(result, "name")

getattr(result, "name", "bill")

setattr(result, "name", "bill")

delattr(result, "name")

反射的用处:

  1. 动态增加属性,包括数据属性和方法属性
# 声明方
class Dad(metaclass=abc.ABCMeta):
    def __init__(self, name):
        self.name = name



# 模拟外部使用方

dad1 = Dad("bill")

if hasattr(dad1, "eatFood"):
    eatFood_func = getattr(dad1,"eatFood")
    eatFood_func()

else:
    pass
  1. 动态导入模块
    方式1:__import__("sys")
    方式2:
import importlib

m = importlib.import_module("m1.t")
m.test()

使用super继承包装父类方法:

# 继承自系统类list  重写系统类的方法
class NewList(list):

    def append(self, obj):
        if type(obj) is str:
            super().append(obj)


list1 = NewList()
list1.append("adf") # 添加成功
list1.append(123)   # 添加失败

类内置方法:

🎈类内置__getattribute__方法:
访问类属性,就是访问__getattribute__方法,如果没有找到访问的属性,则抛出异常,执行__getattr__方法

    def __getattribute__(self, item):
        raise AttributeError("抛出异常 去执行__getattr__")

    def __getattr__(self, item):
        pass

🎈类内置__getattr__方法:
访问类属性的时候,如果有该属性,则不触发__getattr__方法,如果没有该属性,则触发__getattr__方法

🎈类内置__delattr__方法:
只要访问属性就会触发

🎈类内置__setattr__方法只要访问属性就会触发,可以使用设置属性字典__dict__的方法来防止递归死循环

🎈类内置__getitem__ __setitem__等方法,是通过字典resuslt["name"]这种方式取、设置、删除属性等操作触发

🎈使用__str__来改变对象的打印信息:

class Foo:
    def __str__(self):
        return "这是"

print(Foo())

🎈使用__repr__来改变对象在解释器中的打印信息:
优先找__str__,没有会找__repr__

🎈使用__format__来格式化定制打印信息

🎈使用__slots__来节省内存,只能使用声明的属性

class Foo:
    __slots__ = ["name", "age"]

🎈使用__module____class__查看对象所在的模块和类

🎈__del__析构方法

🎈使用__call__定义call方法Foo()


迭代器:

🎈使用__next____iter__实现迭代器协议

迭代器协议:对象必须提供一个next方法,执行该方法返回迭代中的下一项,或者 到最后一项后抛出StopIteration异常,以终止迭代。

可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义了一个__iter__方法)

调用for in循环,实际就是调用对象的iter(obj)方法,也即obj.__iter__方法,装换成迭代器对象,然后执行对象的__next__方法。

对于一个自定义类,想要实现迭代器协议,可以重写如下方法:

def __iter__(self):
      return self

def __next__(self):
      if xxx:
            raise StopIteration("终止")
      return xxx

访问优先级:
1. 类属性
2. 数据描述符
3. 实例属性
4. 非数据描述符
5. 找不到属性触发__getattr__()


上下文管理协议with as

使用__enter____exit__方法
如果执行with as过程中程序异常,会直接执行__exit__并抛出异常,如果__exit__中返回True,则会忽略掉异常继续执行

相关文章

  • 8.自省反射 和 类内置方法

    反射四个方法的使用: 反射的用处: 动态增加属性,包括数据属性和方法属性 动态导入模块方式1:__import__...

  • 面试刷题6:反射和动态代理是什么?

    反射和动态代理是什么? 反射是java提供的一种自省能力,可以在运行时创建类的实例,访问成员变量,方法。 动态代理...

  • Python面向对象:反射(hasattr和getattr和se

    一、反射在类中的使用 反射就是通过字符串来操作类或者对象的属性 反射本质就是在使用内置函数,其中反射有以下四个内置...

  • Python学习笔记5

    面向对象 类和对象的创建 属相相关 方法相关 元类 内置的特殊属性 内置的特殊方法 面向对象 类和对象的创建 类 ...

  • 面向对象基本语法

    目标 ●dir内置函数●定义简单的类(只包含方法)●方法中的self函数●初始化方法●内置方法和属性 01.内置函...

  • java反射和动态代理

    java反射 反射是程序运行时,通过反射直接操作对象或者类。获取类声明的属性和方法,调用方法或者构造对象,设置修改...

  • 类的内置方法与属性

    python中的类在定义时就包含了一系列的专有方法和内置属性,这些内置的属性和方法在操作类时非常便利 内置属性 _...

  • Java学习笔记 27 - 类的加载器、反射

    本文内容介绍1、类加载器2、反射构造方法3、反射成员变量4、反射成员方法5、反射配置文件运行类中的方法 01类加载...

  • 第八篇 网络编程

    一、多态和封装 二、类中的装饰器 三、反射 四、模块中的内置方法 五、网络编程基础 osi七层协议互联网协议按照功...

  • Python反射与自省学习

    1.反射自省的概念 自省:自省就是能够获得自身的结构和方法,给开发者可以灵活的调用,给定一个对象,返回该对象的所有...

网友评论

      本文标题:8.自省反射 和 类内置方法

      本文链接:https://www.haomeiwen.com/subject/gqpzbftx.html