当前位置: 首页 > 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)的深入分析与实战解读 一、概述 命令模式是一种将请求封装为对象从而使你可用不同的请求把客户端与接受请求的对象解耦的模式。在命令模式中,命令对象使得发送者与接收者之间解耦,发送者通过命令对象来执行请求…...

VeraGrid:电力系统规划与仿真的完整解决方案

VeraGrid:电力系统规划与仿真的完整解决方案 【免费下载链接】VeraGrid VeraGrid, a cross-platform power systems software written in Python with user interface, used in academia and industry. 项目地址: https://gitcode.com/gh_mirrors/gr/VeraGrid …...

如何高效提取游戏资源?QuickBMS工具完全指南

如何高效提取游戏资源?QuickBMS工具完全指南 【免费下载链接】QuickBMS QuickBMS by aluigi - Github Mirror 项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS 游戏资源提取是游戏模组制作、本地化和逆向工程的基础技能,而QuickBMS作为一…...

RK3588 Ethernet网络配置与调试实战指南

1. RK3588以太网配置基础入门 第一次拿到RK3588开发板时,很多开发者都会迫不及待地想测试网络功能。作为一款高性能处理器,RK3588通常配备双千兆以太网接口(GMAC0和GMAC1),但在实际使用前需要正确配置才能正常工作。我…...

MySQL实战:主键与外键的5个常见设计误区及优化方案

MySQL实战:主键与外键的5个常见设计误区及优化方案 在数据库设计领域,主键和外键的合理运用直接影响着系统的稳定性和查询效率。许多开发者在项目初期往往忽视这些基础元素的设计规范,直到面临性能瓶颈或数据混乱时才追悔莫及。本文将揭示那…...

Hunyuan-MT 7B效果实测:韩语、俄语、藏语等小语种翻译到底有多准?

Hunyuan-MT 7B效果实测:韩语、俄语、藏语等小语种翻译到底有多准? 1. 小语种翻译的痛点与解决方案 在全球化交流日益频繁的今天,小语种翻译需求快速增长,但传统解决方案往往存在三大痛点: 准确率低:韩语…...

实战应用:基于快马平台将openclaw部署到工业零件分拣场景

在工业自动化领域,零件分拣一直是个既基础又关键的环节。最近我在一个项目中尝试用openclaw算法来解决传送带上混合零件中特定型号螺丝的识别与抓取问题,整个过程既有挑战也有不少收获,今天就来分享一下实战经验。 场景需求分析 传送带上的螺…...

告别官方驱动:深度解读ES7210寄存器,打造你自己的音频采集库(ESP32平台)

告别官方驱动:深度解读ES7210寄存器,打造你自己的音频采集库(ESP32平台) 在嵌入式音频开发领域,ES7210作为一款高性能多通道ADC芯片,被广泛应用于智能音箱、会议系统等场景。然而,官方驱动往往封…...

实战应用:基于快马平台开发企业级极域电子教室校园分发与管理系统

实战应用:基于快马平台开发企业级极域电子教室校园分发与管理系统 最近接手了一个校园信息化项目,需要为某中学开发一套极域电子教室的分发管理系统。学校希望实现软件版本的分班级分时段管理,同时避免下载高峰期的网络拥堵。经过调研&#…...

参数党VS体验派?雅马哈、卡西欧、费森4款热门电钢琴型号终极对决,结果有点意外!

你是否也有这样的时刻?练习时间在不断累积,指法日渐熟练,可弹奏出的声音却依然显得机械、平淡,甚至有点“假”。那种在琴行试弹顶级三角钢琴时,指尖与琴键、琴弦与空气共鸣所带来的微妙震颤与心灵悸动,在自…...

麦科奥特冲刺港股:年亏损1.85亿 估值26亿

雷递网 雷建平 4月5日陕西麦科奥特医药科技股份有限公司(简称“麦科奥特”)日前更新招股书,准备在港交所上市。麦科奥特2025年9月26日完成2.36亿元,投后估值为26.36亿元。年亏损1.85亿麦科奥特成立于2007年,是一家平台…...