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

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

【JavaEE】-- HTTP

1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

day36-多路IO复用

一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...