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

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

class Single:

    __instance =None

    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = super().__new__(cls)
        return cls.__instance


    def __init__(self):
        pass

a = 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 = items

    def __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 logging

logger = logging.getLogger(__name__)

class FileHandler:

    def __init__(self, filename, mode, encoding='utf-8'):
        self.filename = filename
        self.mode = mode
        self.encoding = encoding
        self.file = None

    def __enter__(self):
        self.file = open(self.filename, self.mode, encoding=self.encoding)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_type:
            logger.error(f'出错了,错误为{exc_val}')
        if self.file:
            print('文件正在关闭')
            self.file.close()
        return True


filehandler = 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, Iterable


class MyFib:

    def __init__(self, number):
        self.number = number

    def __iter__(self):
        return FibIterator(self.number)


class FibIterator(Iterator):JICHENB

    def __init__(self, max):
        self.a = 0
        self.b = 1
        self.max = max
        self.current = 0

    def __next__(self):
        self.current += 1
        if self.current == 1:
            return self.current
        if self.current <= self.max:
            self.a, self.b = self.b, self.a + self.b
            return self.b
        else:
            raise StopIteration


my_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 = numbers

    def __getitem__(self, item):
        num = self.numbers[item]
        return num

a_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 obj
        else:
            num = self.numbers[item]
            return num
            
        def __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 = name
        self.age = age

    def __getattr__(self, item):
        return  1


person = 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.mfbz.cn/a/771914.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 年 亚太赛 APMCM (C题)中文赛道国际大学生数学建模挑战赛 | 量子计算的物流配送 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 该段文字…

uni-appx,实现登录功能,弹窗功能。组件之间传值

这篇文章的内容使用组合式API实现的&#xff0c;只有弹窗部分有选择式API的写法介绍。如果想要看其他选择式API&#xff0c;还请下载官方的hello-uni-appx源码进行学习&#xff0c;查看。想要看组合式API的写法&#xff0c;请查看源码 hello-uvue。 hello-uni-appx源码 相比于…

伦敦金价格走势图的资金管理怎么进行?

要成熟地交易伦敦金价格走势图&#xff0c;其实并不是一件容易的事情。其一&#xff0c;我们在很多广告或者周边朋友的宣传之下&#xff0c;觉得它能够帮助我们很快之内实现很多的财富增值&#xff0c;其二&#xff0c;很多投资者觉得伦敦金交易虽然不错&#xff0c;但是风险好…

wordpress 付费主题modown分享,可实现资源付费

该主题下载地址 下载地址 简介 Modown是基于Erphpdown 会员下载插件开发的付费下载资源、付费下载源码、收费附件下载、付费阅读查看隐藏内容、团购下载的WordPress主题&#xff0c;一款针对收费付费下载资源/付费查看内容/付费阅读/付费视频/VIP会员免费下载查看/虚拟资源售…

图书借阅小程序论文(设计)开题报告

一、课题的背景和意义 近些年来&#xff0c;随着移动互联网巅峰时期的来临&#xff0c;互联网产业逐渐趋于“小、轻、微”的方向发展&#xff0c;符合轻应用时代特点的各类技术受到了不同领域的广泛关注。在诸多产品中&#xff0c;被誉为“运行着程序的网站”之名的微信小程序…

2023-2024华为ICT大赛中国区 实践赛昇腾AI赛道 全国总决赛 理论部分真题

Part1 MindSpore模块(7题)&#xff1a; 1、MindSpore深度学习框架的候选运行时支持多种硬件平台&#xff0c;包括CPU、GPU、NPU等。以下关于MindSpore后端的描述中&#xff0c;正确的有哪些项?(多选题) A.MindSpore后端运行时负责将计算图转换为对应硬件平台的执行指令&…

科普文:linux I/O原理、监控、和调优思路

Linux 文件系统 磁盘和文件系统的关系&#xff1a; 磁盘为系统提供了最基本的持久化存储。 文件系统则在磁盘的基础上&#xff0c;提供了一个用来管理文件的树状结构。 文件系统工作原理 索引节点和目录项 文件系统&#xff0c;本身是对存储设备上的文件&#xff0c;进行…

概率论与数理统计_上_科学出版社

contents 前言第1章 事件与概率1.1 随机事件与样本空间1.1.1 样本空间1.1.2 随机事件1.1.3 事件之间的关系与运算 1.2 概率的三种定义及其性质1.2.1 概率的统计定义1.2.2 概率的古典定义1.2.3 概率的几何定义1.2.4 概率的性质 1.3 常用概型公式1.3.1 条件概率计算公式1.3.2 乘法…

阿里Qwen2-72B大模型已是开源榜的王者,为什么还要推出其他参数模型,被其他模型打榜?

6 月 27 日&#xff0c;全球知名的开源平台 Hugging Face 的联合创始人兼首席执行官 Clem 在社交平台激动宣布&#xff0c;阿里 Qwen2-72B 成为了开源模型排行榜的王者。 这是一件大好事&#xff0c;说明了我们在大模型领域从先前的追赶&#xff0c;逐渐走向了领导&#xff0c;…

nextTick的应用和原理理解

一.代码的理解 <template><div id"app"><div></div><button click"fn" ref"box"> {{ name }}</button></div> </template><script> export default {data: function () {return {n…

在Windows 11上更新应用程序的几种方法,总有一种适合你

序言 让你安装的应用程序保持最新是很重要的,而Windows 11使更新Microsoft应用商店和非Microsoft应用商店的应用程序变得非常容易。我们将向你展示如何使用图形方法以及命令行方法来更新你的应用程序。 如何更新Microsoft Store应用程序 如果你的一个或多个应用程序是从Mic…

[吃瓜教程]南瓜书第5章神经网络

1.M-P神经元 M-P神经元&#xff0c;全称为McCulloch-Pitts神经元&#xff0c;是一种数学模型&#xff0c;用于模拟生物神经元的功能。这个模型是由Warren McCulloch和Walter Pitts在1943年提出的。它是人工智能和计算神经科学领域中非常重要的早期模型。 M-P神经元接收n个输入…

【VIM的使用】

Vim 是一个非常强大的文本编辑器&#xff0c;尤其在 Linux 环境下被广泛使用。它基于 vi 编辑器开发而来&#xff0c;增加了许多功能和改进。下面是一个简化的 Vim 教程&#xff0c;帮助你快速上手&#xff1a; 启动 Vim 要启动 Vim&#xff0c;只需在终端中输入 vim [filen…

Python酷库之旅-第三方库Pandas(001)

目录 一、Pandas库的由来 1、背景与起源 1-1、开发背景 1-2、起源时间 2、名称由来 3、发展历程 4、功能与特点 4-1、数据结构 4-2、数据处理能力 5、影响与地位 5-1、数据分析“三剑客”之一 5-2、社区支持 二、Pandas库的应用场景 1、数据分析 2、数据清洗 3…

【机器学习】Google开源大模型Gemma2:原理、微调训练及推理部署实战

目录 一、引言 二、模型简介 2.1 Gemma2概述 2.2 Gemma2 模型架构 三、训练与推理 3.1 Gemma2 模型训练 3.1.1 下载基座模型 3.1.2 导入依赖库 3.1.3 量化配置 3.1.4 分词器和模型实例化 3.1.5 引入PEFT进行LORA配置 3.1.6 样本数据清洗与加载 3.1.7 模型训练与保…

每日复盘-20240704

今日关注&#xff1a; 20240704 六日涨幅最大: ------1--------300391--------- 长药控股 五日涨幅最大: ------1--------300391--------- 长药控股 四日涨幅最大: ------1--------300391--------- 长药控股 三日涨幅最大: ------1--------300391--------- 长药控股 二日涨幅最…

【SSL 1056】最大子矩阵 (多维DP)

题目大意 已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵&#xff0c;你的任务是找到最大的非空&#xff08;大小至少是 1 ∗ 1 1*1 1∗1&#xff09;子矩阵。 比如&#xff0c;如下 4 ∗ 4 4*4 4∗4 子矩阵 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2 的最大子矩阵是 …

Python——面向对象编程(类和对象)2

目录 私有属性和私有方法 01.应用场景及定义方式 02.伪私有属性和私有方法 继承 1.1继承的概念、语法和特点 1.继承的语法&#xff1a; 2.专业术语&#xff1a; 3.继承的传递性 1.2方法的重写 1.覆盖父类的方法 2.对父类方法进行扩展 关于super 1.3 父类的私有属性和…

树状数组基础知识

lowbit: lowbit(x)x&(-x) 树状数组&#xff1a; 树状数组的功能&#xff1a; 数组 在O(1)的时间复杂度实现单点加&#xff1a; 在O(lng n)的时间复杂度实现查询前缀和&#xff1a; 树状数组的定义&#xff1a; 查询前x项的和操作&#xff1a; ll query(int x){ll s0;f…

JavaScript懒加载图像

懒加载图像是一种优化网页性能的技术&#xff0c;它将页面中的图像延迟加载&#xff0c;即在用户需要查看它们之前不会立即加载。这种技术通常用于处理大量或大尺寸图像的网页&#xff0c;特别是那些包含长页面或大量媒体内容的网站。 好处 **1. 加快页面加载速度&#xff1a…
最新文章