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

Python从入门到精通秘籍十七

一、Python的构造方法

在Python中,构造方法是一个特殊的方法,用于创建和初始化类的实例。构造方法的名称是__init__(),它在创建对象时自动调用。

下面是一个示例代码来详细解释Python的构造方法:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef display_info(self):print(f"Name: {self.name}, Age: {self.age}")# 创建Person类的实例
person1 = Person("Alice", 25)
person2 = Person("Bob", 30)# 调用display_info()方法显示信息
person1.display_info()
person2.display_info()

在上面的代码中,我们定义了一个名为Person的类,并在其中定义了构造方法__init__()。构造方法有两个参数nameage,用于初始化对象的属性。

在构造方法中,我们使用self关键字引用当前对象,将传递给构造方法的值分配给对象的属性self.nameself.age

在类中定义了一个名为display_info()的方法,用于显示对象的信息。

然后,我们使用Person类创建了两个实例person1person2,并分别传递不同的参数。

最后,通过调用实例的display_info()方法,我们可以显示每个实例的信息。

运行上述代码,输出结果将会是:

Name: Alice, Age: 25
Name: Bob, Age: 30

这样,我们就可以通过构造方法来创建对象并初始化其属性。构造方法在对象创建时自动调用,并为对象提供所需的初始值。

二、Python的魔术方法

在Python中,魔术方法是一种特殊的方法,它们以双下划线开头和结尾(例如__init__())。这些方法用于执行特定的操作或实现特定的行为。下面是一些常见的Python魔术方法:

  1. __init__(self, ...): 构造方法,在创建对象时自动调用,用于初始化对象。
  2. __str__(self): 返回对象的字符串表示,可通过print()函数打印对象时调用。
  3. __repr__(self): 返回对象的字符串表示,通常用于调试目的。
  4. __len__(self): 返回对象的长度,可通过内置函数len()调用。
  5. __getitem__(self, key): 根据给定的索引或键获取对象的元素,可通过索引、切片或字典方式访问对象。
  6. __setitem__(self, key, value): 根据给定的索引或键设置对象的元素,可通过索引、切片或字典方式修改对象。
  7. __delitem__(self, key): 根据给定的索引或键删除对象的元素,可通过索引、切片或字典方式删除对象。
  8. __iter__(self): 返回一个迭代器对象,使对象可迭代,可使用for循环遍历对象。
  9. __next__(self): 返回迭代器的下一个值,与__iter__()方法一起使用。
  10. __call__(self, ...): 将对象作为函数调用时调用,使对象具有可调用的行为。
  11. __enter__(self)__exit__(self, exc_type, exc_value, traceback): 与with语句一起使用,实现上下文管理器,用于定义对象进入和退出上下文时的操作。

以下是一个示例代码,演示了如何使用其中几个魔术方法:

class Book:def __init__(self, title, author):self.title = titleself.author = authordef __str__(self):return f"Book: {self.title} by {self.author}"def __len__(self):return len(self.title)def __getitem__(self, index):return self.title[index]def __setitem__(self, index, value):self.title = self.title[:index] + value + self.title[index+1:]def __delitem__(self, index):self.title = self.title[:index] + self.title[index+1:]def __iter__(self):self.index = 0return selfdef __next__(self):if self.index >= len(self.title):raise StopIterationchar = self.title[self.index]self.index += 1return charbook = Book("Python Cookbook", "David Beazley")
print(book)  # 调用__str__()方法
print(len(book))  # 调用__len__()方法
print(book[3])  # 调用__getitem__()方法
book[2] = 't'  # 调用__setitem__()方法
print(book.title)
del book[2]  # 调用__delitem__()方法
print(book.title)for char in book:  # 调用__iter__()和__next__()方法print(char)

通过运行上述代码,输出结果为:

Book: Python Cookbook by David Beazley
16
h
Python Cooktbook
Pyon Cooktbook
P
y
t
o
nC
o
o
k
t
b
o
o
k

这个示例演示了魔术方法的一些常见用法。你可以根据自己的需求实现其他魔术方法,以满足特定的功能需求。

三、Python的封装

封装是面向对象编程中的一个重要概念,它指的是将数据和方法包装在一个类中,并通过访问控制来限制对数据的直接访问。Python通过使用属性和方法来实现封装。下面是一个示例代码,演示了如何在Python中实现封装:

class Person:def __init__(self, name, age):self._name = name  # 使用单个下划线表示属性为受保护的self.__age = age  # 使用双下划线表示属性为私有的def display_info(self):print(f"Name: {self._name}, Age: {self.__age}")def get_age(self):return self.__agedef set_age(self, age):if age >= 0:self.__age = ageelse:print("Age cannot be negative!")person = Person("Alice", 25)
person.display_info()print(person._name)  # 访问受保护的属性
# print(person.__age)  # 错误,无法直接访问私有属性print(person.get_age())  # 通过公共方法获取私有属性的值
person.set_age(30)  # 通过公共方法设置私有属性的值
print(person.get_age())
person.set_age(-10)  # 尝试设置负数年龄

运行上述代码,输出结果为:

Name: Alice, Age: 25
Alice
25
30
Age cannot be negative!

在上面的代码中,我们定义了一个名为Person的类,并在其中封装了_name__age属性。

属性_name使用单个下划线作为前缀,表示它是受保护的属性,外部可以访问但应该被视为私有的。

属性__age使用双下划线作为前缀,表示它是私有的属性,外部无法直接访问。

我们定义了display_info()方法来显示对象的信息,并使用get_age()set_age()方法分别来获取和设置私有属性__age的值。在set_age()方法中,我们进行了一些条件检查以确保年龄不会是负数。

通过创建Person对象并调用其公共方法,我们可以访问和修改封装在类内部的属性。但是,直接访问受保护的属性和私有属性将会导致错误或访问限制。

这样,我们就实现了对数据的封装,通过公共方法来控制对私有属性的访问和修改。这提供了更好的代码组织和安全性。

相关文章:

Python从入门到精通秘籍十七

一、Python的构造方法 在Python中,构造方法是一个特殊的方法,用于创建和初始化类的实例。构造方法的名称是__init__(),它在创建对象时自动调用。 下面是一个示例代码来详细解释Python的构造方法: class Person:def __init__(se…...

Java——抽象类和接口

目录 1.抽象类 1.概念: 2.语法 3.特性 2.接口 1.概念 2.语法 3.特性 1.抽象类 1.概念: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的…...

React—— props校验(非typescript校验类型)

非typescript环境下,当我们在封装组件的时候,接受props时传入的内容,需要做类型检测,那我们可以用props校验进行类型的检查。 props校验允许在创建组件的时候,就约定props的格式、类型等 实现步骤: 导入 …...

Go——map操作及原理

一.map介绍和使用 map是一种无序的基于key-value的数据结构,Go语言的map是引用类型,必须初始化才可以使用。 1. 定义 Go语言中,map类型语法如下: map[KeyType]ValueType KeyType表示键类型ValueType表示值类型 map类型的变量默认…...

网络安全实训Day9

写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义:通过定义策略和规则来限制哪些流量能经过防火墙,哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…...

kubernetes实战(1)之虚拟机centos搭建k8s集群

一,环境准备 centos7系统,每个系统2c2g,40g,centos7下载地址:centos-7.9.2009-isos-x86_64安装包下载_开源镜像站-阿里云 # 每个节点分别设置对应主机名 hostnamectl set-hostname master hostnamectl set-hostname …...

基于python+vue分类信息服务平台移动端的设计与实现flask-django-php-nodejs

分类信息服务平台是在Android操作系统下的应用平台。为防止出现兼容性及稳定性问题,框架选择的是django,Android与后台服务端之间的数据存储主要通过MySQL。用户在使用应用时产生的数据通过 python等语言传递给数据库。通过此方式促进分类信息服务平台信…...

【蓝牙协议栈】【BLE】低功耗蓝牙配对绑定过程分析(超详细)

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅,【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01…...

MySQL表内容的增删查改

在前面几章的内容中我们学习了数据库的增删查改,表的增删查改,这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 1.创建Create 我们先创建…...

Java的三大特性之一——多态(完)

前言 http://t.csdnimg.cn/0CAuc 在上一篇我们已经详讲了继承特性,在这我们将进行最后一个也是最重要的特性讲解——多态 在讲解之前我们需要具备对向上转型以及方法重写的初步了解,这有助于我们对多态的认识 1.向上转型 即实际就是创建一个子类对象…...

算法-最短路径

图的最短路径问题是一个经典的计算机科学和运筹学问题,旨在找到图中两个顶点之间的最短路径。这种问题在多种场景中都有应用,如网络路由、地图导航等。 解决图的最短路径问题有多种算法,其中最著名的包括: 1.迪杰斯特拉算法 (1).…...

【软考---系统架构设计师】特殊的操作系统介绍

目录 一、嵌入式系统(EOS) (1)嵌入式系统的特点 (2)硬件抽象层 (3)嵌入式系统的开发设计 二、实时操作系统(RTOS) (1)实时性能…...

大模型: 提示词工程(prompt engineering)

文章目录 一、什么是提示词工程二、提示词应用1、提示技巧一:表达清晰2、提示词技巧2:设置角色 一、什么是提示词工程 提示词工程主要是用于优化与大模型交互的提示或查询操作,其目的在于能够更加准确的获取提问者想要获取的答案&#xff0c…...

RabbitMQ的事务机制

想要保证发送者一定能把消息发送给RabbitMQ,一种是通过Confirm机制,另一种就是通过事务机制。 RabbitMQ的事务机制,允许生产者将一组操作打包成一个原子事务单元,要么全部执行成功,要么全部失败。事务提供了一种确保消…...

41 物体检测和目标检测数据集【李沐动手学深度学习v2课程笔记】

目录 1. 物体检测 2. 边缘框实现 3.数据集 4. 小结 1. 物体检测 2. 边缘框实现 %matplotlib inline import torch from d2l import torch as d2ld2l.set_figsize() img d2l.plt.imread(../img/catdog.jpg) d2l.plt.imshow(img);#save def box_corner_to_center(boxes):&q…...

软件包管理(rpm+yum)

1.介绍软件包安装方式 rpm包安装: rpm是个软件包管理工具,通过.rpm后缀来操作 -i #安装 -q #查询 -l #列出软件包下的文件 -e #卸载 -h, #软件包安装的时候列出哈希标记 (和 -v 一起使用效果更好) -v, #提供更多的详细信息输出 rpm的痛点&#…...

网关层针对各微服务动态修改Ribbon路由策略

目录 一、介绍 二、常规的微服务设置路由算法方式 三、通过不懈努力,找到解决思路 四、验证 五、总结 一、介绍 最近,遇到这么一个需求: 1、需要在网关层(目前使用zuul)为某一个服务指定自定义算法IP Hash路由策…...

如何从零开始拆解uni-app开发的vue项目(二)

昨天书写了一篇如何从零开始uni-app开发的vue项目,今天准备写一篇处理界面元素动态加载的案例: 背景:有不同类别的设备,每个设备有每日检查项目、每周检查项目、每年检查项目,需要维保人员,根据不同设备和检查类别对检查项目进行处理,提交数据。 首先看一下界面: &l…...

【生成对抗网络GAN】一篇文章讲透~

目录 引言 一、生成对抗网络的基本原理 1 初始化生成器和判别器 2 训练判别器 3 训练生成器 4 交替训练 5 评估和调整 二、生成对抗网络的应用领域 1 图像生成与编辑 2 语音合成与音频处理 3 文本生成与对话系统 4 数据增强与隐私保护 三、代码事例 四、生成对抗…...

【设计模式】Java 设计模式之模板命令模式(Command)

命令模式(Command)的深入分析与实战解读 一、概述 命令模式是一种将请求封装为对象从而使你可用不同的请求把客户端与接受请求的对象解耦的模式。在命令模式中,命令对象使得发送者与接收者之间解耦,发送者通过命令对象来执行请求…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

Web后端基础(基础知识)

BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...