【python实操】python小程序之如何使用私有公有属性和方法

news2024/12/22 16:29:16

引言

python小程序之如何使用私有公有

文章目录

  • 引言
  • 一、如何使用私有公有属性和方法
    • 1.1 题目
    • 1.2 代码
    • 1.3 代码解释
      • 1.3.1 逐行解释
      • 1.3.1 代码行为总结
  • 二、思考
    • 2.1 名称修饰
    • 2.2 总结

一、如何使用私有公有属性和方法

1.1 题目

如何使用私有公有属性、方法

1.2 代码

class Person:
    def __init__(self, name, age):
        self.name = name
# 私有的本质, 是 Python 解释器执行代码,发现属性名或者方法名前有两个_, 会将这个名字重命名
# 会在这个名字的前边加上 _类名前缀,即 self.__age ===> self._Person__age
        self.__age = age
        # 年龄, 将其定义为私有属性, 属性名前加上两个 _

    def __str__(self):
        # 在类内部可以访问私有属性的
        return f'名字: {self.name}, 年龄: {self.__age}'


xm = Person('小明', 18)
print(xm)
# 在类外部直接访问 age 属性
# print(xm.__age) # 会报错, 在类外部不能直接使用私有属性
# 直接修改 age 属性
xm.__age = 20
# 这个不是修改私有属性, 是添加了一个公有的属性 __age
print(xm)
# 名字: 小明, 年龄: 18
print(xm._Person__age)
# 能用但是不要用 18
xm._Person__age = 19
print(xm)
# 名字: 小明, 年龄: 19

输出结果:
在这里插入图片描述

1.3 代码解释

1.3.1 逐行解释

  1. 代码示例定义了一个 Person 类,其中包含了一个私有属性 __age
class Person:
    def __init__(self, name, age):
        self.name = name  # 公有属性,可以直接访问
        self.__age = age  # 私有属性,名称前有两个下划线
    def __str__(self):
        # 在类的内部可以正常访问私有属性
        return f'名字: {self.name}, 年龄: {self.__age}'
  1. __init__ 方法中,self.name 被设置为一个公有属性,可以直接从类的外部访问self.__age 被设置为一个私有属性,这是通过在属性名前加上两个下划线来实现的
  2. 接下来,创建了 Person 类的一个实例,并尝试进行一些操作:
xm = Person('小明', 18)
print(xm)  # 输出: 名字: 小明, 年龄: 18

这里,print(xm) 调用了 __str__ 方法,该方法返回了一个格式化的字符串,其中包含了私有属性 __age 的值。
4. 直接从类的外部访问私有属性:

# print(xm.__age)  # 这行代码会报错,因为在类外部不能直接访问私有属性
  1. 由于 __age 是一个私有属性,直接访问它会导致 AttributeError
  2. 在类的外部设置一个名为 __age 的属性:
xm.__age = 20
print(xm)  # 输出: 名字: 小明, 年龄: 18
  1. 这里实际上并没有修改 Person 类中的私有属性 __age,而是为 xm 实例添加了一个新的公有属性 __age。由于名称修饰,这个新的属性与类的私有属性 __age 是不同的
  2. 通过名称修饰的方式直接访问并修改了私有属性:
print(xm._Person__age)  # 输出: 18
xm._Person__age = 19
print(xm)  # 输出: 名字: 小明, 年龄: 19
  1. 通过使用 _类名__属性名 的格式,可以直接访问和修改私有属性。虽然技术上可行,但这通常被认为是不好的做法,因为它违反了封装的原则,并且可能会引起维护上的问题。正确的方法是使用类提供的公共接口来访问和修改属性

1.3.1 代码行为总结

  • 当我们创建 Person 类的实例 xm 时,__age 被设置为 18
  • 当尝试直接从类外部访问或修改 __age 时,这不会影响到实际的私有属性_Person__age,而是创建了一个新的公有属性 __age
  • 若要真正访问或修改私有属性 __age,我们需要使用它的名字改写后的形式_Person__age
  • 使用 print(xm) 会调用 __str__ 方法,该方法返回一个格式化的字符串,展示 name__age

这个例子很好地展示了 python 中私有属性的行为以及如何通过名字改写机制来间接访问和修改它们。尽管可以通过这种方式访问私有成员,但通常建议遵循封装的原则,不要在类的外部直接操作私有成员

二、思考

python 本身并没有提供像某些其他编程语言(如 Java 或 C++)中的真正私有成员的概念。在 python 中,通过名称修饰(name mangling)来实现一种伪私有的效果,但这并不是真正的私有访问控制

2.1 名称修饰

名称修饰是 python 对以两个下划线开头的类成员名称(但不包括结尾的下划线)所做的一种处理。python 会将这些名称重写,使得它们在类外部更难以访问。这个过程通过在成员名称前面加上一个类名和一个下划线来实现
例如:

class MyClass:
    def __init__(self):
        self.__private_attribute = "私有属性"
    def __private_method(self):
        return "私有方法"
obj = MyClass()

在这个例子中,__private_attribute__private_method 都会被名称修饰。如果你尝试从类外部访问这些成员,你会得到一个 AttributeError。然而,如果知道如何计算名称修饰后的名称,仍然可以访问它们:

print(obj._MyClass__private_attribute)  # 输出: 私有属性
print(obj._MyClass__private_method())   # 输出: 私有方法

尽管名称修饰使得访问这些成员变得困难,但它并不是真正的私有访问控制,因为仍然有一种方法可以访问这些成员(尽管不推荐这样做)
在 python 的类定义中,通常使用单个下划线前缀来表示成员是受保护的,意味着它们不应该被外部访问,但这仅是一个约定,python 不会强制执行它

class MyClass:
    def __init__(self):
        self._protected_attribute = "受保护的属性"
    def _protected_method(self):
        return "受保护的方法"

在这里,_protected_attribute_protected_method 是受保护的,按照约定,它们不应该从类的外部直接访问,但 python 不会阻止这样做

2.2 总结

总结来说,python 没有提供真正的私有成员机制,而是依赖于约定和名称修饰来阻止对某些成员的不恰当访问

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python快速编程小案例——打印蚂蚁森林植树证书

提示:(个人学习),案例来自工业和信息化“十三五”人才培养规划教材,《Python快速编程入门》第2版,黑马程序员◎编著 蚂蚁森林是支付宝客户端发起“碳账户”的一款公益活动:用户通过步行地铁出行、在线消费等…

华为云应用侧Android Studio开发

本文将介绍如何使用AndroidStudio开发APP完成与接入华为云IoTDA设备的对接,包括属性参数获以及取命令下发。 一、鉴权认证 应用侧需要通过IAM服务鉴权,获取token,华为账号创建 IAM 用户, 可以为创建的用户分配权限 认证鉴权_设…

开源全文搜索(搜索引擎)

吃水不忘挖井人,介绍Doug Cutting大牛是十分有必要的。 最早,接触到搜索引擎,知道有个Nutch(开源搜索引擎),于是开始查看Nutch相关的资料,发现了Nutch的创始人Doug Cutting,随着项目…

Python 如何使用 Redis 作为缓存

Python 如何使用 Redis 作为缓存 一、引言 在现代 Web 应用程序和数据密集型服务中,性能 和 响应速度 是至关重要的因素。而当应用需要频繁访问相同的数据时,直接从数据库获取数据会耗费大量的时间和资源。因此,缓存系统成为了提升性能的重…

做一只由 OpenCV 控制的仿生手

这个项目介绍了如何制作和控制一只仿生手。作者最初受到Instagram上一个视频的启发,该视频展示了使用MPU6050传感器追踪手部动作并在屏幕上显示3D模型。作者决定将这个想法进一步发展,使用OpenCV来控制一只真实的仿生手。 大家好,在这篇教程中…

强大的PDF到Word转换工具

Solid Converter:强大的PDF到Word转换工具推荐 在日常工作和学习中,PDF是最常用的文件格式之一。然而,编辑PDF文档并不总是那么方便,尤其是当你需要将PDF文件转换为Word文档时。Solid Converter 是一款强大的工具,专为…

SpringBoot美发门店系统:数据驱动的决策

3系统分析 3.1可行性分析 通过对本美发门店管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本美发门店管理系统采用SSM框架,JAVA作为开发语…

7.并发编程之并发安全问题

1 线程安全性 什么是线程安全性?可以这么理解, 我们所写的代码在并发情况下使用 时,总是能表现出正确的行为;反之,未实现线程安全的代码,表现的行为是不可预知的,有可能正确,而绝大多…

九寨沟,智慧旅游新名片

九寨沟属于自然类景区,以优美的自然风光取胜,景区文化内涵相对缺失。智慧化和文旅融合是智慧文旅景区的两个必备条件,九寨沟在智慧文旅景区建设过程中,经历了两个阶段,先是从传统景区迈向智慧景区,然后是充…

PostgreSQL学习笔记六:模式SCHEMA

模式(Schema) PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦

MedMamba代码解释及用于糖尿病视网膜病变分类

MedMamba原理和用于糖尿病视网膜病变检测尝试 1.MedMamba原理 MedMamba发表于2024.9.28,是构建在Vision Mamba基础之上,融合了卷积神经网的架构,结构如下图: 原理简述就是图片输入后按通道输入后切分为两部分,一部分走…

每日论文18-24ISCAS采用磁调谐变压器低温CMOS28GHzVCO

《28 GHz VCO Using Magnetically Tuning Trifilar Transformer in Cryogenic CMOS Application 》24ISCAS 瞟到了这篇文章,开关真的是可以加在任何地方哈哈哈,还挺特别 通过改变电感偏压来改变Var的偏压,来拓宽带宽,其实是个挺简…

processing像素画教程

前提:各位已经安装了processing 第一步:创建一个简单的网格 我们首先创建一个网格来定义我们作品的像素画布。网格将帮助您在适当的位置绘制每个像素。 int gridSize 20; // 每个像素的大小 int cols, rows; void setup() {size(400, 400); // 设置画…

k8s 的网络通信

目录 1 k8s通信整体架构 2 flannel 网络插件 2.1 flannel 插件组成 2.2 flannel 插件的通信过程 2.3 flannel 支持的后端模式 3 calico 网络插件 3.1 calico 简介 3.2 calico 网络架构 3.3 部署 calico 1 k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较…

QTableView加入小灯泡

通过重载QAbstractTableModel中的data方法 QVariant CTblModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); int col index.column(); if (col ledColIndex && role Qt::DecorationRole) { return Q…

股指期货的杠杆是怎么体现和使用的?

股指期货的杠杆效应是通过保证金交易实现的。投资者只需支付合约价值的一小部分作为保证金,即可控制整个合约的价值。例如,如果一个股指期货合约的价值为100,000元,而保证金比例为10%,那么投资者只需支付10,000元即可控制这个合约…

PPT分享:埃森哲-业务流程BPM能力框架体系

PPT下载链接见文末~ 业务流程管理(BPM, Business Process Management)的能力框架体系是一个全面、系统的流程管理方法论和工具集,旨在帮助企业优化和持续改进其业务流程,从而提升运营效率和市场竞争力。 一、BPM能力框架体系概述…

云计算的江湖,风云再起

大数据产业创新服务媒体 ——聚焦数据 改变商业 还记得当年英特尔的广告语吗?“Intel Inside”,这个标志性的标签几乎成了计算设备的象征。然而,随着AI大模型的迅速崛起,计算的核心从CPU悄然转向了GPU。一场前所未有的技术革命正…

【学术会议征稿】第四届公共管理与大数据分析国际学术会议(PMBDA 2024)

第四届公共管理与大数据分析国际学术会议(PMBDA 2024) 2024 4th International Conference on Public Management and Big Data Analysis 第四届公共管理与大数据分析国际学术会议 (PMBDA 2024)将于2024年12月20-22日在中国青岛召开。会议主题主要围绕…