Python小白学习教程从入门到入坑------第二十三课 封装(语法进阶)

面向对象的三大特征:封装、继承、多态

一、封装

1.1 何为封装

封装:在Python中指的是隐藏对象中一些不希望被外部所访问到的属性或者方法。将复杂的信息、流程给包起来,内部处理,让使用者只需要通过简单的操作步骤,就能实现。

在Python中,封装(Encapsulation)是面向对象编程(OOP)的一个核心概念。

规范的说法:封装指的是将对象的属性和方法结合在一起,并隐藏对象的内部实现细节,只通过公开的接口(通常是方法)与外部进行交互。封装的目的在于保护对象的内部状态,防止外部代码直接访问和修改,从而确保对象的完整性和安全性。

当不使用封装时,类里面的属性可以被看见甚至可以被修改

eg:

class Person:
    name = 'junjun'    # 类属性
pe = Person()
print(pe.name)      # 输出内容:junjun
Person.name = 'yuyu'
print(Person.name)  # 输出内容:yuyu
print(pe.name)      # 输出内容:yuyu

这种不封装的代码很容易被篡改,会带来一系列的安全问题,为了解决安全性这一问题,我们要对类进行封装操作

1.2 隐藏属性(私有权限)

隐藏属性:只允许在类的内部使用,无法通过对象访问

在属性名或者方法名前面加上两个下划线__

class Person:
    name = "junjun"   # 类属性
    __age = 18        # 隐藏属性
pe = Person()
print(pe.name)
print(pe.__age)    #报错: __age被隐藏,不可以在类的外部访问类的隐藏属性

但如果类的隐藏属性已经被定义好了,我们又需要从外边访问它的值该怎么做呢?

这里有两种方法:

第一种: (了解即可,不太正规)

注意:隐藏属性实际上是将名字修改为:_类名__属性名,上面例子中的__age 就被修改为_Person__age

eg:

class Person:
    name = "junjun"   # 类属性
    __age = 28        # 隐藏属性
pe = Person()
print(pe.name)
# print(pe.__age)    #报错: __age被隐藏,不可以在类的外部访问类的隐藏属性
print(pe._Person__age)
# 输出结果:
# junjun
# 28

此种方法也可以对隐藏属性进行修改

class Person:
    name = "junjun"   # 类属性
    __age = 28       # 隐藏属性
pe = Person()
print(pe.name)
# print(pe.__age)    #报错: __age被隐藏,不可以在类的外部访问类的隐藏属性
print(pe._Person__age)
pe._Person__age = 18
print(pe._Person__age)
# 输出结果:
# junjun
# 28
# 18

 第二种:在类的内部访问——推荐使用,正规手段

eg:

class Person:
    name = "junjun"   # 类属性
    __age = 28       # 隐藏属性
    def introduce(self):   # 实例方法
        Person.__age = 16    # 可以对隐藏属性进行更改
        print(f"{Person.name}的年龄是{Person.__age}")  # 在实例方法中访问类属性和隐藏属性
pe = Person()
pe.introduce()
# 输出结果:junjun的年龄是16

1.3 私有属性/方法

1. xxx:普通属性/方法,如果是类中定义的,则类可以在任何地方使用

2. _xxx: 单下划线开头,声明私有属性/方法,如果定义在类中,外部可以使用,子类也可以继承,但是在另一个py文件中通过 from  xxx   import  *  导入时,无法导入。此种命名方法一般是为了避免与Python关键字冲突而采用的命名方法

3. __xxx: 双下划线开头,隐藏属性,如果定义在类中,无法在外部直接访问,子类不会继承,要访问只能通过间接的方式,另一个py文件中通过 from  xxx  import  *导入时,也无法导入 。这种命名方法一般是Python中的魔法方法或属性,都是有特殊含义或者功能的,自己不要轻易定义

eg:

class Person:
    name = "junjun"   # 类属性
    __age = 28       # 隐藏属性(双下划线)
    _sex = "女"      # 私有属性(单下划线)
pe = Person()
# print(pe.sex)  报错
# 使用对象名._属性名调用
print(pe._sex)
# 使用对象._类名__属性名访问隐藏属性
print(pe._Person__age)
# 输出结果:
# 女
# 28

1.4 隐藏方法 

在Python中,没有严格意义上的“隐藏方法”的概念,因为Python是一种动态类型语言,并且其访问控制机制相对宽松

然而,有一些约定俗成的命名和编码规范,可以让开发者通过命名来暗示方法的可见性和使用意图 

class Man:
    def __play(self):     # 隐藏方法
        print("玩手机")
    def funa(self):       # 平平无奇的实例方法
        print("平平无奇的实例方法")
        Man.__play(self)   # 在实例方法中调用私有方法   ————不推荐
        self.__play()     # 推荐使用,更简便
ma = Man()
ma.funa()

1.5 私有方法

在Python中,尽管没有像其他某些编程语言(例如Java)那样的严格访问修饰符来定义私有方法,但Python有一种约定俗成的方式来暗示某个方法是私有的

这种方式主要是通过在方法名前添加一个下划线前缀(_)来实现的。需要注意的是,这仅仅是一种约定,而不是Python语言本身的强制规则

私有方法通常被设计为仅在类的内部使用,而不应被类的外部代码直接调用

尽管从技术上讲,外部代码仍然可以访问这些以单下划线开头的方法,但按照Python的社区规范,这样的访问是不被推荐的,因为它违背了封装的原则

eg:

class MyClass:  
    def __init__(self, value):  
        self._private_value = value  # 私有属性  
  
    def _private_method(self):  
        # 这是一个私有方法,它应该只在类的内部被调用  
        print(f"Private value is: {self._private_value}")  
  
    def public_method(self):  
        # 这是一个公共方法,它可以被类的外部代码调用  
        self._private_method()  # 在类的内部调用私有方法  
  
# 创建类的实例  
obj = MyClass(42)  
  
# 调用公共方法,它会间接调用私有方法  
obj.public_method()  # 输出: Private value is: 42  
  
# 直接调用私有方法(虽然技术上可行,但不符合Python的封装原则)  
# obj._private_method()  # 这行代码在技术上是可行的,但通常不建议这样做

在上面的示例中,_private_method 是一个私有方法,它应该只在 MyClass 类的内部被调用

public_method 是一个公共方法,它可以被类的外部代码调用,并且它内部调用了私有方法 _private_method

尽管可以通过 obj._private_method() 直接调用私有方法,但这样做违背了封装的原则,并可能导致代码的可维护性和可读性降低

因此,建议遵循Python的社区规范,不要直接访问以单下划线开头的私有方法和属性

需要注意的是,双下划线前缀(__)会导致Python进行名称改写(name mangling),但这通常用于避免子类意外覆盖父类的方法或属性,而不是用于定义私有方法

使用双下划线前缀的方法名会在类定义时被改写为 _ClassName__methodName 的形式,但仍然可以通过这个改写后的名称在外部访问

因此,双下划线前缀也不是严格意义上的私有方法定义

今天的分享就到这里了,希望能帮助到大家~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

less解决function中return写法在浏览器被识别成Object导致样式失败的问题

问题描述: 一开始写的是: baseFontSize: 37.5px;//基于屏幕尺寸/10得出的基准font-size// return失败,浏览器显示为[object Object],[object Object] .pxToRem(px){value: px / baseFontSize * 1rem;return value; } 使用height: .pxToRem(40px);之后浏览器却是这…

OpenCV视觉分析之目标跟踪(4)目标跟踪类TrackerDaSiamRPN的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::TrackerDaSiamRPN 是 OpenCV 中用于目标跟踪的一个类,它实现了 DaSiam RPN(Deformable Siamese Region Proposal Net…

高效视频制作大提速,视频剪辑软件的高级自定义命令功能批量调整视频的色调、饱和度和亮度,轻松驾驭视频编辑技巧

在浩瀚的数字海洋中,视频如同璀璨的星辰,而每一颗星辰都渴望被精心雕琢,闪耀出最独特的光芒。想象一下,你手握一把神奇的钥匙,能够轻松解锁批量视频剪辑的奥秘,让每一帧画面都跃动着你的创意与激情。这把钥…

Vue3入门--[vue/compiler-sfc] Unexpected token, expected “,“ (18:0)

新手小白学习Vue–入门就踩坑系列 问题描述 创建了一个Person.vue,保存后直接报错: [plugin:vite:vue] [vue/compiler-sfc] Unexpected token, expected "," (18:0) 在网上搜了半天也没找到原因,最后还得靠自己,现将解…

【制造业&盒子】箱子检测系统源码&数据集全套:改进yolo11-swintransformer

改进yolo11-MLCA等200全套创新点大全:箱子检测系统源码&数据集全套 1.图片效果展示 项目来源 人工智能促进会 2024.11.01 注意:由于项目一直在更新迭代,上面“1.图片效果展示”和“2.视频效果展示”展示的系统图片或者视频可能为…

Spring Security 框架篇-深入了解 Spring Security 的认证功能流程和自定义实现登录接口(实现自定义认证过滤器、登出功能)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Spring Security 框架概述 2.0 Spring Security 核心功能-认证功能 2.1 过滤器链 2.2 登录认证流程 2.3 思路分析 3.0 登录认证具体操作 3.1 环境搭建 3.2 实现 U…

HBuilderx修改主题色-改变编辑器背景颜色等

效果图: 第一步我们打开HBuilderX 选择工具 – 主题 – 选择(雅蓝) 然后再设置,源码视图里面打开Setting.json文件 3.将一下代码赋值到右侧用户设置即可 {"workbench.colorCustomizations": {// "[Defau…

食堂采购系统源码:实现供应链管理平台功能模块的技术实践

在当前数字化转型浪潮中,餐饮和食堂管理的需求越来越高,食堂采购系统逐渐成为企业和组织优化管理、降低成本的关键工具。 一、食堂采购系统的核心功能概述 一个完善的食堂采购系统不仅需要具备传统的订单管理、库存管理、供应商管理功能,还…

Python 工具库每日推荐 【Sphinx】

文章目录 引言文档工具的重要性今日推荐:Sphinx 文档生成工具主要功能:使用场景:安装与配置快速上手示例代码代码解释实际应用案例案例:为 Python 项目生成 API 文档案例分析高级特性自定义主题国际化支持扩展阅读与资源优缺点分析优点:缺点:总结【 已更新完 TypeScript …

stm32不小心把SWD和JTAG都给关了,程序下载不进去,怎么办?

因为想用STM32F103的PA15引脚,调试程序的时候不小心把SWD和JTAD接口都给关了,先看下罪魁祸首 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//关掉JTAG,不关SWGPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);//关掉SW&am…

Transformer+KAN系列时间序列预测代码

前段时间,来自 MIT 等机构的研究者提出了一种非常有潜力的替代方法 ——KAN。该方法在准确性和可解释性方面表现优于 MLP。而且,它能以非常少的参数量胜过以更大参数量运行的 MLP。 KAN的发布,引起了AI社区大量的关注与讨论,同时…

【OD-支持在线评测】文本统计分析(200分)

📎 在线评测链接 https://app5938.acapp.acwing.com.cn/contest/11/problem/OD1076 🍓 OJ题目截图 🍿 最新机试E卷,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测,专栏文章质量平均 94 分 🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系解锁~ 文章目录 📎…

C++(友元、异常机制、静态成员、单例模式)

友元 友元可以访问与其好友关系的类中的私有成员,使用friend关键字进行修饰。(友元破坏了类的封装性)。 特点 (1)友元是单向的 (2)友元不能传递 (3)友元…

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…

ElementUI中el-table双击单元格显示输入框

效果图 实现 <el-table:data"formData.products"row-key"id":show-header"true"style"width: 100%; margin-top: 16px"class"zq-table-theme-info"bordercell-dblclick"handleDbClick"> <el-table-col…

强化学习之父Richard Sutton给出一个简单思路,大幅增强所有RL算法

在当今的大模型时代&#xff0c;以 RLHF 为代表的强化学习方法具有无可替代的重要性&#xff0c;甚至成为了 OpenAI ο1 等模型实现强大推理能力的关键。 但这些强化学习方法仍有改进空间。近日&#xff0c;强化学习之父、阿尔伯塔大学教授 Richard Sutton 的团队低调更新了一…

一台手机可以登录运营多少个TikTok账号?

很多TikTok内容创作者和商家通过运营多个账号来实现品牌曝光和产品销售&#xff0c;这种矩阵运营方式需要一定的技巧和设备成本&#xff0c;那么对于很多新手来说&#xff0c;一台手机可以登录和运营多少个TikTok账号呢&#xff1f; 一、运营TikTok账号的数量限制 TikTok的官…

Rembg模型构建教程

一、介绍 Rembg&#xff0c;全称为“Remove Background”&#xff0c;是一款基于深度学习的图像背景去除工具。它的主要功能是通过智能识别图像中的前景物体&#xff0c;并将其从背景中分离出来&#xff0c;从而创建具有透明背景的图像。 二、基础环境 系统&#xff1a;Ubun…

AI直播带货场景切换模块的搭建!

AI直播带货&#xff0c;作为电商领域的新宠&#xff0c;正以其独特的魅力和高效的营销手段&#xff0c;引领着销售模式的新变革。 在AI直播带货中&#xff0c;场景切换模块是不可或缺的一部分&#xff0c;它不仅能够提升观众的观看体验&#xff0c;还能更好地展示商品&#xf…

力扣每日一题2024/11/2 3226. 使两个整数相等的位更改次数

class Solution:def minChanges(self, n: int, k: int) -> int:binary_n format(n, b)binary_k format(k, b)res0# 将两个二进制字符串长度对齐&#xff0c;前面补零max_len max(len(binary_n), len(binary_k))binary_n binary_n.zfill(max_len)binary_k binary_k.zfil…