17.上线文管理器,等面向操作

1.new
创建对象实例,在实例对象被创建前调用,与之相对的是__init__,
__new__方法必须返回一个类的实例对象,通常情况下会调用父类的__new__方法来创建实例,并返回实例对象.
第一个参数是cls
__new__方法允许你控制实例的创建过程,可以实现自定义的逻辑.
单例模式,无论实例化多少次,始终都是同一个对象.
(回收站,文件夹等操作 )

class Single:__instance =Nonedef __new__(cls, *args, **kwargs):if not cls.__instance:cls.__instance = super().__new__(cls)return cls.__instancedef __init__(self):passa = Single()
print(id(a))
a2 =Single()
print(id(a2))

del,
当对象被释放时,执行,通常用来执行一些资源释放或清理操作,如关闭文件.释放网络连接等.并不保证一定会调用.
__del__跟python中的关键字del没有关系

class Test:def __init__(self):print('__init__')def __del__(self):print('__init')test = Test()
print(test)

垃圾回收机制,0的时侯回收
2.repr__和__len
__repr__用于定义对象的字符串表示形式,
__str__和__repr__两者用途不同,一个是给程序看的,一个是给人看的.
print(),str()调用str,交互模式下a,b会调用repr
__len__用于定于对象的长度大小,在对象上调用内置的len()函数时,python会查找对象是否定义了__len__方法,如果有则调用该方法并返回长度值

class List:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)mylist = List([1,2,3,4])
print(len(mylist))

3.上下文协议
允许创建和可用于with语句的上下文管理器:使用上下文管理器可以在进入和推出代码块时执行特定操作,如资源分配和释放.
简化了异常捕获的代码,让异常捕获的封装性更好.
两者必须同时存在.
enter(self),
进入代码块前被调用,用于执行一些准备操作.
可以返回一个值,该值被赋给as关键字后面的变量
exit(self, exc_type, exc_value, exc_traceback)
在退出代码块时调用,无论代码块是否发生异常.
可以用于执行一些清理操作,如资源的释放.
若果代码块没有异常发生,参数都为None,如果有异常,参数包含异常类型,异常实例和跟踪信息
如果__exit__方法返回True,异常不会向上继续传播,返回False则异常会继续向上抛.

import logginglogger = logging.getLogger(__name__)class FileHandler:def __init__(self, filename, mode, encoding='utf-8'):self.filename = filenameself.mode = modeself.encoding = encodingself.file = Nonedef __enter__(self):self.file = open(self.filename, self.mode, encoding=self.encoding)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):if exc_type:logger.error(f'出错了,错误为{exc_val}')if self.file:print('文件正在关闭')self.file.close()return Truefilehandler = FileHandler('ta.py', 'r',encoding='utf-8')
with filehandler as f:con = f.read()print(con)

4.可迭代对象和迭代器:

a_list = [1, 2, 3, 4]
aa_list = iter(a_list)
print(next(aa_list))
print(next(aa_list))

可迭代对象和迭代器是用来遍历数据集合的概念,在很多情况系下,用来实现数据的迭代操作.
可迭代对象:iterable
实现了__iter__()方法的都可以视为可迭代对象,列表,字典,元组,集合,字符串,
可以使用for循环遍历元素
可以使用iter()转换成迭代器
迭代器:iterator
实现了__iter__()和__next__()的方法的对象
iter()返回迭代器本身
next()返回迭代器的下一个元素
如果没有元素会抛出stopiteration异常
可以使用for循环遍历,也可以使用next()函数获取逐个元素
总结:
可迭代对象是具有迭代性质的对象,迭代器是一个实现了迭代协议的对象.
可迭代对象可以通过iter()方法转换成迭代器
迭代器是一种一次性的数据获取方式,每次调用next()获取下一个元素

from collections.abc import Iterator, Iterableclass MyFib:def __init__(self, number):self.number = numberdef __iter__(self):return FibIterator(self.number)class FibIterator(Iterator):JICHENBdef __init__(self, max):self.a = 0self.b = 1self.max = maxself.current = 0def __next__(self):self.current += 1if self.current == 1:return self.currentif self.current <= self.max:self.a, self.b = self.b, self.a + self.breturn self.belse:raise StopIterationmy_fib = MyFib(5)
for fib in my_fib:print(fib)

5.自定义序列
[ ]数据操作
getttemsteitem,delitem,用于自定义对象的索引访问和操作,他们在创建自定义容器类时非常有用,
5.1,getitem,
这个方法,方法定义了,使用索引访问对象时的行为,使用obj[key]进行索引操作时,会调用该方法,并将索引key作为参数传递给这个方法,
迭代,没有iter方法时会退而求其次选择__getitem__方法

class MyNumbers:def __init__(self, numbers):self.numbers = numbersdef __getitem__(self, item):num = self.numbers[item]return numa_list = [1, 2, 3, 4, 5, 6]# a_dict也可以   my_number['key']
my_numbers = MyNumbers(a_list)
print(my_numbers[2])

s = slice()
list[s]
列表切片返回的是列表,元组切片返回的是元组
按理说应该返回与原本数据类型一样的数据类型

        if isinstance(item, slice):temp = self.numbers[item]cls = type(self)obj = cls(temp)return objelse:num = self.numbers[item]return numdef __str__(self):return f"{self.numbers}"

contains,

   def __contains__(self, item):return item in self.numbers

5.2,setitem
这个方法定义了使用索引赋值操作时的行为,使用obj[key] = value 时,会调用该方法,并将key和value的值作为参数进行传递.\

    def __setitem__(self, key, value):self.numbers[key] = value

5.3 delitem
定义使用del obj[key]进行索引删除操作时的行为.

    def __delitem__(self, key):self.numbers.pop(key)

6.属性相关
getattr,setattr,delattr
用于自定义对象的属性访问和操作,允许控制属性的获取,设置和删除行为,从而实现自定义的属性操作逻辑
getattr(self, name)
当访问不存在属性,会调用该方法,将name作为参数传递给该方法,可以在这个方法里面实现返回默认值或者抛出异常

class Person:def __init__(self,name,age):self.name = nameself.age = agedef __getattr__(self, item):return  1person = Person('wangwu', 18)
print(person.name)
print(person.gender)

return self.dic[key]

setattr,对属性的设置进行限制,设置属性就会触发.将属性名name和值value作为参数传递给该方法,可以在这个方法中实现对应的赋值操作,进行值的修改或验证.
需要调用父类方法

    def __setattr__(self, key, value):print(f'接收参数key的值{key},接收参数value的值{value}')super().__setattr__(key, value)

无限递归的问题
delatr(self, name)删除属性时,会调用该方法,并将name作为参数传递给该方法.,可以实现删除属性的逻辑

    def __delattr__(self, item):if item in ['xxx', 'xxxxx']:raise AttributeError(f'{item!r}为基础属性,不可删除')super(Person, self).__delattr__(item)

7.可调用的
类里面实现__call__方法就可以进行调用
def call(self, 参数)
与装饰器一起使用
8.运算符
def lt(self, other):
return self.___< other.value
__gt__同理 >
eq = !=同样可以使用
ne 不等于
__le__小于等于
__ge

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866168.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL体系架构

1.1.MySQL的分支与变种 MySQL变种有好几个&#xff0c;主要有三个久经考验的主流变种&#xff1a;Percona Server&#xff0c;MariaDB和 Drizzle。它们都有活跃的用户社区和一些商业支持&#xff0c;均由独立的服务供应商支持。同时还有几个优秀的开源关系数据库&#xff0c;值…

JVM专题之Java对象内存模型

一个Java对象在内存中包括3个部分: 对象头、实例数据和对齐填充 数据 内存 -- CPU 寄存器 -127 补码 10000001 - 11111111 32位的处理器 一次能够去处理32个二进制位 4字节的数据 64位操作系统 8字节 2的64次方的寻址空间 指针压缩…

从零开始:大模型简介与应用|实战系列

实战系列 相信有不少伙伴对大模型有所耳闻&#xff0c;但也是一知半解&#xff0c;也许你知道很重要可以为自己的工作提供帮助但是不知道该如何结合&#xff0c;又或是转行的过程中并不知道从何入手&#xff0c;网上的教程要么不包含具体的操作步骤要么需要好几篇合在一起才能…

鸿蒙小案例-首选项工具类

一个简单的首选项工具类 主要提供方法 初始化 init()方法建议在EntryAbility-》onWindowStageCreate 方法中使用 没多少东西&#xff0c;放一下测试代码 import { PrefUtil } from ./PrefUtil; import { promptAction } from kit.ArkUI;Entry Component struct PrefIndex {St…

在window上搭建docker

1、打开Hyper-V安装 在地址栏输入控制面板&#xff0c;然后回车 勾选Hyper-V安装&#xff0c;如果没有找到Hyper-V&#xff0c;那么请走第2步 2、如果没有Hyper-V(可选&#xff09;第一步无法打开 家庭版本需要开启Hyper-V 创建一个文本文档&#xff0c;后缀名称为.bat.名称…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【密钥生成介绍及算法规格】

密钥生成介绍及算法规格 当业务需要使用HUKS生成随机密钥&#xff0c;并由HUKS进行安全保存时&#xff0c;可以调用HUKS的接口生成密钥。 注意&#xff1a; 密钥别名中禁止包含个人数据等敏感信息。 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harm…

【C++】 ——【模板初阶】——基础详解

目录 1. 泛型编程 1.1 泛型编程的概念 1.2 泛型编程的历史与发展 1.3 泛型编程的优势 1.4 泛型编程的挑战 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 2.6 函数模板的特化 2.7 函数模板的使…

html+css+js淘宝商品界面

点击商品&#xff0c;alert弹出商品ID 图片使用了占位符图片&#xff0c;加载可能会慢一点 你可以把它换成自己的图片&#x1f603;源代码在图片后面 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"…

时空预测+特征分解!高性能!EMD-Transformer和Transformer多变量交通流量时空预测对比

时空预测特征分解&#xff01;高性能&#xff01;EMD-Transformer和Transformer多变量交通流量时空预测对比 目录 时空预测特征分解&#xff01;高性能&#xff01;EMD-Transformer和Transformer多变量交通流量时空预测对比效果一览基本介绍程序设计参考资料 效果一览 基本介绍…

番外篇 | YOLOv8改进之即插即用全维度动态卷积ODConv + 更换Neck网络为GFPN

前言:Hello大家好,我是小哥谈。本文所做出的改进是在YOLOv8中引入即插即用全维度动态卷积ODConv和更换Neck网络为GFPN,希望大家学习之后能够有所收获~!🌈 目录 🚀1.基础概念 🚀2.网络结构 🚀3.添加步骤 🚀4.改进方法 🍀🍀步骤1:block.py文件修改…

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头&#xff0c;实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点&#xff08;AP&#xff09;工作模式–Arduino程序&#xff0c;当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…

解析MySQL核心技术:视图的实用指南与实践案例

在数据库管理中&#xff0c;MySQL视图&#xff08;View&#xff09;是一种强大的功能&#xff0c;利用它可以简化复杂查询、提高数据安全性以及增强代码的可维护性。本篇文章将详细介绍MySQL视图的相关知识&#xff0c;包括视图的创建、修改、删除、使用场景以及常见的最佳实践…

Python学生信息管理系统(完整代码)

引言&#xff1a;&#xff08;假装不是一个大学生课设&#xff09;在现代教育管理中&#xff0c;学生管理系统显得尤为重要。这种系统能够帮助教育机构有效地管理学生资料、成绩、出勤以及其他教育相关活动&#xff0c;从而提高管理效率并减少人为错误。通过使用Python&#xf…

亚马逊跟卖选品erp采集,跟卖卖家的选品利器,提升选品效率!

今天给亚马逊跟卖卖家&#xff0c;分享我现在在用的两种选品方式&#xff0c;做个铺货或者是跟卖都可以&#xff0c;是不是很多卖家选品现在都是亚马逊前端页面或是新品榜单选择产品跟卖&#xff0c;这样找品这就相当于大海捞针&#xff0c;而且新品榜单的产品你能看到那其他卖…

经典卷积神经网络 LeNet

一、实例图片 #我们传入的是28*28&#xff0c;所以加了padding net nn.Sequential(nn.Conv2d(1, 6, kernel_size5, padding2), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Conv2d(6, 16, kernel_size5), nn.Sigmoid(),nn.AvgPool2d(kernel_size2, stride2),nn.Flat…

Linux Swap机制关键点分析

1. page被swap出去之后,再次缺页是怎么找到找个换出的页面? 正常内存的页面是通过pte映射找到page的,swap出去的page有其特殊的方式:swap的页面page->private字段保存的是:swap_entry_t通过swap_entry_t就能找到该页面的扇区号sector_t,拿到扇区号就可以从块设备中读…

day04-组织架构

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.组织架构-树组件应用树形组件-用层级结构展示信息&#xff0c;可展开或折叠。 2.组织架构-树组件自定义结构3.组织架构-获取组织架构数据4.组织架构-递归转化树形…

Redis 典型应用——分布式锁

一、什么是分布式锁 在一个分布式的系统中&#xff0c;也会涉及到多个节点访问同一个公共资源的情况&#xff0c;此时就需要通过锁来做互斥控制&#xff0c;避免出现类似于 "线程安全" 的问题&#xff1b; 而 Java 中的 synchronized&#xff0c;只能在当前进程中生…

【C语言】控制台扫雷(C语言实现)

目录 博文目的实现思路项目创建文件解释 具体实现判断玩家进行游戏还是退出扫雷棋盘的确定地图初始化埋雷玩家扫雷的实现雷判断函数 源码game.cgame.h扫雷.c 博文目的 相信不少人都学习了c语言的函数&#xff0c;循环&#xff0c;分支那我们就可以写一个控制台的扫雷小游戏来检…