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

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的第二种写法 一样的效果 继承也有两种方法 也有superreturn 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=nameself.age=agedef __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=nameself.age=agedef __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=nameself.age=agedef __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=aself.b = bdef __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=aself.b = bdef __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=agedef __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=Nonefirst_init=Falsedef __new__(cls, *args, **kwargs):#如果这个实例是空的 就进行赋值if not cls.instanced:cls.instanced=object.__new__(cls)return cls.instanceddef __init__(self,age,name):if not self.first_init:self.age=ageself.name=name# 这行如果注释掉 就会打印两个 20 hello 两个是一个对象 一个地址 赋值记住最后一个的SingObject.first_init=Trues1=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.rhkb.cn/news/411874.html

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

相关文章

滚雪球学MyBatis-Plus(01):学前导读

&#x1f300;写在前面 我是bug菌&#xff0c;CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家&#xff0c;C站博客之星Top30&#xff0c;华为云2023年度十佳博主&#xff0c;掘金多年度人气作者Top40&#xff0c;掘金等各大社区平台签约作者&#xff…

CS2饰品价格趋势怎么看?以及最佳入手时机

CS2饰品价格趋势怎么看?以及最佳入手时机 CS2饰品价格趋势怎么看?以及最佳入手时机 CS2选品时价格趋势图到底怎么看&#xff1f;什么时候值得真正入手&#xff1f;&#xff1f; 8月中上旬这波涨势大家抓住了吗&#xff1f;反正我们是抓住了。然而很多人都是听别人说行情上涨…

Linux之ip命令详解

华子目录 1.ip命令是什么1.1ip命令的由来1.2ip命令的安装包1.2ip选项&#xff08;基本不用&#xff09; 2.查看网络信息2.1显示全部网络接口信息2.2显示单个网络接口信息2.3显示单个接口状态2.4查看路由表2.5查看arp缓存 3.设置网卡ip地址3.1启用或停用网卡3.2设置默认网关3.3新…

Priority_Queue 的使用和模拟

目录 一基本的介绍 优先队列是一种容器适配器&#xff1b;他的第一个元素总是他包含所有元素里面最大的一个。 他的底层容器可以是任何标准容器类模板&#xff0c;也可以是其他特定设计的容器类。 这个底层容器应该可以通过随机访问迭 代器&#xff0c;并支持以下操作&#x…

【Java】—— Java面向对象进阶:Java银行账户管理系统设计与实现

目录 1. 账户类&#xff08;Account&#xff09; 2. 客户类&#xff08;Customer&#xff09; 3. 银行类&#xff08;Bank&#xff09; 4. 测试类&#xff08;BankTest&#xff09; 运行结果 在今天的博文中&#xff0c;我们将一起探讨一个简单的Java银行账户管理系统的设…

前端Vue使用AES的GCM模式加密

文章目录 前端加密测试Java加解密代码 写了个新的前端项目&#xff0c;公司要求&#xff0c;账号密码这些必须是加密传输的&#xff1b;后端使用了GCM模式加密&#xff0c;前端是复制的一个以前项目的代码&#xff0c;原来是有写加密的&#xff0c;使用的是CryptoJS组件CTR模式…

2024-8-28作业C++/QT

代码&#xff1a; #include <iostream> #include <cstring> #include <array> #include <iomanip> using namespace std; int main() { //array<char,128> a; //array<char,128>::iterator iter; string str; getline(c…

YOLO | YOLO目标检测算法(基础入门)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 YOLO目标检测算法 深度学习经典检测方法1、两阶段&#xff08;Two-stage&#xff09;2、单阶段&#xff08;One-stage&#xff09; 深度学习经典检测方法 1、两阶段&a…

jenkins发布文件到远程服务器

jenkins安装 安装教程 后台启动脚本 创建脚本&#xff1a;start_jenkins.sh ls for pid in $(ps -ef|grep jenkins.war|grep -v grep|cut -c 10-16); doecho $pid;kill -9 $pid; done;nohup java -Djava.awt.headlesstrue -jar /usr/local/jenkins/jenkins.war --webroot/…

游戏分享网站|基于SprinBoot+vue的游戏分享网站系统(源码+数据库+文档)

游戏分享网站 目录 基于SprinBootvue的游戏分享网站 一、前言 二、系统设计 三、系统功能设计 5.1系统功能模块 5.2后台登录 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#x…

SpringCloud乐尚代驾学习笔记:环境搭建(二)

文章目录 1、前端环境1.1、注册微信开发者账号1.2、开通服务与插件1.3、微信开发者工具使用 2、服务器端环境2.1、安装mysql2.2、安装rabbitmq2.3、安装redis2.4、安装nacos2.5、安装minio 3、导入初始化项目 1、前端环境 1.1、注册微信开发者账号 虽然开发微信小程序可以使用…

牛客NC313 两个数组的交集 C++

牛客NC313 两个数组的交集 C 思路&#x1f914;&#xff1a; 用哈希表存储第一个数组&#xff0c;再和第二个数组对比&#xff0c;对比成功就添加到新的数组中&#xff0c;之后将哈希表的该位置变为false&#xff0c;防止重复添加。这里数据范围仅有1000&#xff0c;所以我们可…

nginx转发接口地址【非常实用】

使用场景 由于客户的需求是要访问一个外网接口 比如http://58.20.57.190:6652 实例 http://58.20.57.190:6652//uploadBasePatient?Barcode1000000073&customerCode1 比如外网才能访问&#xff0c;科室电脑是访问不了外网的 我们就需要中间在一个既有外网又有内网的前置…

少儿编程入门,Scratch、Python与C++,谁能成为孩子的首选语言?

编程已不再是专业人士的专利&#xff0c;而是成为了一项基本技能。对于孩子们来说&#xff0c;学习编程不仅能提高逻辑思维能力&#xff0c;还能为他们的未来职业生涯打下坚实基础。那么问题来了&#xff0c;面对Scratch、Python和C这三门编程语言&#xff0c;究竟哪一款更适合…

Datawhale AI夏令营

一、物体检测算法 物体检测算法主要分为两类&#xff1a;One-Stage&#xff08;一阶段&#xff09;和Two-Stage&#xff08;两阶段&#xff09;模型。 二、One-Stage目标检测算法 定义&#xff1a;One-Stage目标检测算法是一种直接在图像上进行目标检测的方法&#xff0c;无…

Docker原理及实例

目录 一 Docker简介及部署方法 1.1 Docker简介 1.1.1 什么是docker&#xff1f; 1.1.2 docker在企业中的应用场景 1.1.3 docker与虚拟化的对比 1.1.4 docker的优势 2 部署docker 2.1 容器工作方法 2.2 部署第一个容器 2.2.1 配置软件仓库 2.2.2 安装docker-ce并启动服…

8月28日

思维导图 作业&#xff1a; 使用C手动封装一个顺序表&#xff0c;包含成员数组一个&#xff0c;成员变量N个 代码&#xff1a; #include <iostream>using namespace std;using datatype int; #define MAX 30struct SeqList {private:datatype *data;int size 0;int l…

SpringBoot3与AOP完美结合:轻松追踪用户操作,实现精准日志记录

程序员必备宝典https://tmxkj.top/#/ 1.pom文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId&g…

Spring八股文

重点 描述一下bean的生命周期 简述版 调用构造器 或者是通过工厂的方式创建Bean对象给bean对象的属性注入值调用初始化方法&#xff0c;进行初始化&#xff0c; 初始化方法是通过init-method来指定的.使用IOC容器关闭时&#xff0c; 销毁Bean对象 详细&#xff1a; 1. 实例化 …

Qt QCustomPlot画色阶图

工作中用到QCustomPlot画曲线图和色阶图&#xff0c;并且在色阶图上添加文字&#xff0c;圆圈或者几条线段画一些图形&#xff0c;这里写个简单的例子把这几个功能记录一下&#xff0c;代码在这里&#xff1a; https://download.csdn.net/download/Sakuya__/89681279https://…