python基础(13魔法方法介绍)

news2024/9/29 15:25:25

python系列文章目录

python基础(01变量&数据类型&运算符)
python基础(02序列共性)
python基础(03列表和元组)
python基础(04字符串&字典)
python基础(05集合set)
python基础(06控制语句)
python基础(07函数)
python基础(08类和对象)
python基础(09闭包&装饰器)
python基础(10异常处理)
python基础(11文件读取)
python基础(12迭代器&生成器)


文章目录

  • python系列文章目录
  • 前言
  • 一、说明
  • 二、方法介绍
    • 1. __new__方法
    • 2.__call__方法
    • 3.__len__方法
    • 4.比较运算符
    • 5.算术运算符
    • 6.__getattr__方法
    • 7.__setattr__方法(self,key,value)
    • 8.__str__和__repr__方法
  • 三、单态(单例)模式
    • 四、callable()知识点
  • 总结


前言

本文主要介绍了一些魔法方法,以及它们的定义和使用


一、说明

1.函数

def 定义的

2.方法

定义在类class里面的

3.说明

方法是函数的一种特殊情况

4.魔法方法

在python内部已经包含的 被双下划线包围的方法,这些方法,在特定的操作时会被自动调用

例如:__init__  __iter__  __next__

二、方法介绍

1. __new__方法

说明:

实例化对象时调用的第一个方法 不是__init__ (面试题)

例子

class Cat():
    #__new__ 第一个参数为cls,代表要实例化的类(Cat),其他参数直接传给__init__方法
    def __new__(cls,*args,**kwargs):
        print("this is new")
        #__new__对当前类进行实例化,一定要返回这个实例化对象  传递给__init__中的self
        # 如果return这行注释掉  __init__的self就没有数据 init方法内都不会执行 笔试题
        # return object.__new__(cls)
        #return的第二种写法 一样的效果 继承也有两种方法 也有super
        return super(Cat,cls).__new__(cls)
    #__init__的self就是__new__返回的实例
    def __init__(self):
        print("this is init")
        print(self)            #打印这个实例<__main__.Cat object at 0x00000262B6613EE0>  对象
        print(self.__class__)  #打印这个实例的类<class '__main__.Cat'>  类
cat=Cat()
cat1=Cat()
#这里的cat和cat1是两个对象 地址不一样

2.__call__方法

说明

在类的内部实现了这个方法 该类创建的实例化对象也是一个可调用对象

例子

class Animal:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __call__(self,food):
        print(f"my name is {self.name},i am {self.age} old")
        print(f"i eat {food}")

dog=Animal("taidi","3")
print(callable(Animal))            #true
print(callable(dog))               #true
dog("meat")                        #可以调用

3.__len__方法

说明

获取类的长度 自己定义 可以定义任意参数作为长度

例子

class Animal:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __call__(self,food):
        print(f"my name is {self.name},i am {self.age} old")
        print(f"i eat {food}")
    def __len__(self):
        return len(self.name)
cat=Animal("咪咪123","5")
cat("age")
print(len(cat))  #5

4.比较运算符

在这里插入图片描述

class Animal:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __call__(self,food):
        print(f"my name is {self.name},i am {self.age} old")
        print(f"i eat {food}")
    def __len__(self):
        return len(self.name)
    def __eq__(self, other):
        return self.age==other.age
cat=Animal("咪咪","5")
dog=Animal("taidi","3")
print(dog==cat)  #false 

5.算术运算符

在这里插入图片描述

class Vector:
    def __init__(self,a,b):
        self.a=a
        self.b = b
    def __add__(self, other):
        return Vector(self.a+other.a,self.b+other.b)
v1=Vector(1,2)
v2=Vector(2,3)
v3=v1+v2
print(v3.a,v3.b)  #3,5

6.__getattr__方法

说明

  • 当用户获取一个不存在的属性的时的行为 当获取到不存在的属性时 我们对抛出的异常进行自定义
class Vector:
    def __init__(self,a,b):
        self.a=a
        self.b = b
    def __add__(self, other):
        return Vector(self.a+other.a,self.b+other.b)
    def __getattr__(self, name):
        print(f"sorry no {name}")
v1=Vector(1,2)
v2=Vector(2,3)
v3=v1+v2
print(v1.c)   #sorry no c  None

7.__setattr__方法(self,key,value)

说明

  • 当一个属性被设置时的行为
  • 当类实例每个属性进行赋值时,都会首先调用setattr方法 并且在该方法中将属性名和属性值添加到类实例的__dict__属性中
  • #dict 实例有哪些属性值

例子

class Animal:
    def __init__(self,name,age):
        # print(self.__dict__)
        self.name=name
        # print(self.__dict__)
        self.age=age
        # print(self.__dict__)
    # def __setattr__(self, key, value):
    #     print("-"*30)
    #     print(f"setting key is {key},valve is {value}")
    #     print(f"current __dict__ is {self.__dict__}")
    #     #将属性添加到dict中
    #     self.__dict__[key]=value

# cat=Animal("咪咪","5")
# print(cat.name,cat.age)  #本质是访问dict里面的属性
# print(cat)  #地址

8.__str__和__repr__方法

说明

  • str:定制化显示输出信息 给用户看的
  • repr:定制化显示输出信息 给开发者看的 交互模式下可以直接打印出 pig

例子

class Animal:
    def __init__(self,name,age):
        # print(self.__dict__)
        self.name=name
        # print(self.__dict__)
        self.age=age
    def __str__(self):
        return f"i am {self.name},i am {self.age} old"
    def __repr__(self):
        return f"animal am {self.name},animal am {self.age} old"
pig=Animal("zhu","7")
print(pig)     #i am zhu,i am 7 old  这时候和上面不一样 不是打印地址 而是定制化输出

三、单态(单例)模式


# class SingObject:
    #两个类变量
    instanced=None
    first_init=False
    def __new__(cls, *args, **kwargs):
        #如果这个实例是空的 就进行赋值
        if not cls.instanced:
            cls.instanced=object.__new__(cls)
        return cls.instanced
    def __init__(self,age,name):
        if not self.first_init:
            self.age=age
            self.name=name
            # 这行如果注释掉 就会打印两个 20 hello 两个是一个对象 一个地址 赋值记住最后一个的
            SingObject.first_init=True

s1=SingObject(18,"jiajia")
s2=SingObject(20,"hello")
---------------------------------------------------
# #地址一样 同样的对象 这就是单例模式
# #两个都会打印出18 jiajia
# print(s1.age,s1.name)
# print(s2.age,s2.name)

四、callable()知识点

可调用对象

  • 凡是可以将()直接应用到自身并执行的 包括自己定义的函数 内置函数 类
  • #callable判断对象是不是可调用的对象

print(callable(SingObject))  #true  类可调用
# print(callable(s2))          #false 实例化对象不可调用

总结

本文的知识,一定要动手敲一遍,理解其含义。

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

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

相关文章

docker Desktop报错 error pulling image configuration 处理

问题描述 在 docker 拉数据 出现以下错误 error pulling image configurarion&#xff1a; 这个问题 主要是 可能应该某些原因不能网络无法连上镜像 原因分析&#xff1a; 1。 2024年 5月以后 国内很多IP都 。。。懂的都懂&#xff0c;很多 VPN 也是。。。 懂的都懂&#x…

Edge资源占用优化:调整浏览器设置与关闭自动更新检查

最近&#xff0c;作者在学习过程中&#xff0c;打开任务管理器的时候注意到&#xff0c;即使没有打开浏览器&#xff0c;edge依然有着内存占用较高的情况&#xff1a; 于是就在网上收集了一些后台调优的方法&#xff0c;如果各位朋友有更多优化浏览器资源占用的方法&#xff0c…

ansible自动化运维项目详细讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Ansible 是一个开源的自动化工具&#xff0c;主要用于配置管理、应用部署、任务自动化和IT编排。在实际的运维项目中&#xff0c;Ansible可以帮助运维工程师以一致、可重复和可靠的方式管理大量服务器和服务…

论文翻译:Scaling Instruction-Finetuned Language Models

Scaling Instruction-Finetuned Language Models https://www.jmlr.org/papers/volume25/23-0870/23-0870.pdf 指令微调语言模型 文章目录 指令微调语言模型摘要1. 引言2. Flan微调2.1 微调数据2.2 微调过程2.3 评估协议 3. 扩展到5400亿参数和1836个任务4. 带有思维链注释的微…

python实战二-筛选多个Excel中数据

筛选12个月中单日销售额大于300的数据&#xff0c;并将符合条件数据存储到新表中。 import time from openpyxl import Workbook, load_workbook import os """ 筛选销售额大于300的销售数据&#xff0c;创建新表存储 """ def 筛选数据(file_dir…

iOS 模拟器打不开:unable to boot the simulator

重启电脑后发现模拟器打不开&#xff0c;提示如下&#xff1a; 解决方法&#xff1a; 1、在Finder里command shift G前往文件夹 ~/Library/Developer/CoreSimulator/Caches2、删除Caches文件里面的dyld文件 3、重启模拟器即可

前缀和2️⃣-二维前缀和

题目链接&#xff1a;**【模板】二维前缀和_牛客题霸_牛客网** 题目描述&#xff1a; 解法&#xff1a; 算法思路&#xff1a; 类比于一维数组的形式&#xff0c;如果我们能处理出来从[0, 0] 位置到 [i, j] 位置这片区域内所有元素的累加和&#xff0c;就可以在O(1) 的时间内…

BioEdit 序列比对编辑器

软件介绍 BioEdit是一个功能齐全免费的分子生物学应用软件&#xff0c;可以完成核苷酸序列和蛋白质序列进行所有常规的分析操作。 如&#xff1a;序列比对、序列检索、引物设计、系统发育分析等。与DNAMAN 相比&#xff0c;其分析内容相对更丰富一些&#xff0c;而且提供了很…

一种基于YOLOv10的高精度光伏板缺陷检测算法(原创自研),适用缺陷检测场景、小缺陷场景

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文原创自研算法&#xff1a;一种基于YOLOv10的高精度光伏板缺陷检测算法&#xff0c;魔改SPPF_attention一种新颖的基于内容引导注意力(CGA)的混合融合&#xff0c;mAP50从原始的0.838提升至0.868 &#x1f4a1;&#x1f4a1;&…

3D Tiles的4x4的仿射变换矩阵

前言 项目需要&#xff0c;使用Cesium技术&#xff0c;把STL格式模型加载进去。 一、格式转换 第一步&#xff0c;先将STL文件转换为glTF格式 第二步&#xff0c;将glTF文件转换为3D Tiles格式&#xff0c;使用Cesium ion 二、矩阵整体结构 这个矩阵是一个4x4的仿射变换矩阵&…

探索多模态人工智能:融合视觉、语言与声音的未来智能系统

前言 在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的每一个角落&#xff0c;从智能手机的语音助手到自动驾驶汽车&#xff0c;再到医疗诊断和个性化推荐系统。然而&#xff0c;随着技术的进步&#xff0c;我们对智能系统的要求也在不…

[LLM][Prompt Engineering]:大语言模型上下文学习-What、How、Why?

上下文学习 上下文学习什么是上下文学习2. 示例的选择2.1 相关度排序2.2 集合多样性2.3 大语言模型 3. 示例格式3.1 人工标注3.2 利用大语言模型自动生成 4. 示例顺序5. 上下文学习为什么可以work5.1 能力来源5.2 ICL的能力 Reference 在GPT-3的论文中&#xff0c;OpenAI 研究团…

深度学习示例1-全零通道的 MNIST 数据训练模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.datasets import mnist import numpy as np(train_images, train_labels), _ = mnist.load_data() train_images = train_images.reshape((60000, 28 * 28)) train_ima…

基于FPGA的OV5640摄像头图像采集

1.OV5640简介 OV5640是OV&#xff08;OmniVision&#xff09;公司推出的一款CMOS图像传感器&#xff0c;实际感光阵列为&#xff1a;2592 x 1944&#xff08;即500w像素&#xff09;&#xff0c;该传感器内部集成了图像出炉的电路&#xff0c;包括自动曝光控制&#xff08;AEC…

基于深度学习的单目标跟踪系统

基于深度学习的单目标跟踪&#xff0c;效果吊打传统算法&#xff0c;3060显卡上达到实时&#xff0c;代码python和c两个版本都有。 基于深度学习的单目标跟踪系统是一种先进的计算机视觉技术&#xff0c;它可以实现实时的、高精度的目标跟踪。与传统的基于特征匹配或模板匹配的…

实现A-Z滑动检索菜单

写个这小玩意真麻烦 <template><div id"letterPeo"><!-- <button click"getasd">获取</button>--><div class"letter"><div v-for"(item, index) in letter" :key"index" clas…

高速接口IO片上SSN分析方法

Gbps信号在当今的高速IO设计中非常常见。由于封装和板上的寄生电感&#xff0c;高速信号在高频下汲取电流&#xff0c;导致大的电源尖峰或骤降。像DDR5这样的并行总线接口有20多个高速IO一起切换&#xff0c;导致同时切换噪声&#xff08;SSN&#xff09;。SSN的不期望的产物是…

苹果手机怎么恢复微信聊天记录?原来这4个方法这么好用

苹果手机的微信聊天记录不见了怎么办&#xff1f;想要解决这个问题&#xff0c;可以先了解一下导致聊天记录消失的原因有哪些。 误触手机&#xff1a;我们有时误触到某个按钮&#xff0c;也可能恢复导致聊天记录消失。卸载微信&#xff1a;卸载微信后&#xff0c;重新安装再打…

国密起步5:GmSSL3交叉编译arm64

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 之前已经建立好了交叉编译环境…

让 Jenkins 到极狐GitLab 的迁移变得更加简单

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 文章原文可以点击极狐GitLab 官方资源中心查…