当前位置: 首页 > news >正文

python魔术方法(二)

__getattr__()

class A:def __getattr__(self,name):print(f"getting {name}")raise AttributeErroro = A()
print(o.test)

程序调用一个对象的属性,当这个属性不存的时候希望程序做些什么,这里我们打印希望的属性,并且抛出异常

__getattribute__()

class A:def __init__(self):self.exist = Truedef __getattribute__(self, item):print(f"getting {item}")return Noneo = A()
print(o.exist)
print(o.test)

只要尝试读取一个对象的属性,这个方法都会被调用,上面的演示表示,无论读取的属性是否存在都会被调用

class A:def __init__(self):self.exist = Trueself.counter = 0def __getattribute__(self, item):if item == 'exist':self.counter += 1return super().__getattribute__(item)o = A()
print(o.exist)
print(o.counter)

这里我们在魔术方法的返回值过程中不能直接调用__getattribute__()方法,这样的话会无限递归。需要加 super

__setattr__()

添加或者修改属性就会触发他的执行

class A:def __init__(self):self.exist = Trueself.counter = 0def __setattr__(self, key, value):print(f"key is {key} value is {value}")super().__setattr__(key, value)o = A()
o.exist = False
print(o.exist)

__delattr__()

在一个对象正常产生和消亡的过程中,这个函数是不会被调用的,这个是在我们尝试删除一个对象的属性的时候才会被调用。

class A:def __init__(self):self.exist = Trueself.counter = 0def __delattr__(self, item):print(f"del {item}")super().__delattr__(item)o = A()
del o.exist

__dir__()

dir方法用来返回所有可用的属性或者方法,python规定这个方法必须返回一个sequence,最常见的sequence就是列表了,我们这里就返回一个列表

class A:def __init__(self):self.exist = Trueself.counter = 0def __dir__(self):lst = super().__dir__()return [el for el in lst if not el.startswith("_")]o = A()
print(dir(o))

__slots__

这个不算是一个方法,是一个属性,它规定了这个类中可以有那些自定义的 attribute,是一个白名单机制

__init_subclass__()

这个方法要定义在基类中,当我们以这个类为基类,创建衍生类的时候,就会调用这个方法

class Base:def __init_subclass__(cls, **kwargs):print(cls)class A(Base):passo = A()

__set_name__()

class D:def __set_name__(self, owner, name):print(owner,name)class A:x = D()o = A()

当我们在另一个类中去构建这个class的instance的时候,这个方法就会被调用,其实还是定义descripter

http://www.lryc.cn/news/9973.html

相关文章:

  • cmd for命令笔记
  • 4.1 Filter-policy
  • day15_常用类
  • 【网络原理5】IP协议篇
  • Unity导出WebGL工程,并部署本地web服务器
  • 蓝桥杯考试总结汇总
  • 备战蓝桥杯【二维前缀和】
  • 阿里P6细谈Python简易接口自动化测试框架设计与实现,我直呼内行
  • 数据库存储
  • hive学习笔记
  • 7大体系防作弊,牛客放大招了!严肃笔试客户端上线!
  • R语言广义可加模型在空气环境污染方面的应用(1)
  • CSDN 编程竞赛二十九期题解
  • 基于STM32采用CS创世 SD NAND(贴片SD卡)完成FATFS文件系统移植与测试
  • K_A12_007 基于STM32等单片机驱动AS608光学指纹识别模块 OLED0.96显示
  • map和set介绍及其底层模拟实现
  • 实现一个比ant功能更丰富的Modal组件
  • 2023美赛F题思路数据代码分享
  • Flutter如何与Native(Android)进行交互
  • 数据库主从复制和读写分离
  • Java并发编程面试题——线程安全(原子性、可见性、有序性)
  • DialogFragment内存泄露问题能不能一次性改好
  • java学习--多线程
  • 90后阿里P7技术专家晒出工资单:狠补了这个,真香...
  • 2023美赛C题:Wordle筛选算法
  • SpringBoot 集成 Kafka
  • OpenCV 图像金字塔算子
  • 【自学Linux】Linux一切皆文件
  • CUDA C++扩展的详细描述
  • 为什么重写equals必须重写hashCode