[Python] 类的访问限制

news/2025/1/7 17:49:24/

4.1 访问限制

在之前的专栏:Python基础中,笔者在面向对象编程中介绍了类、对象的属性,按照属性的访问程度可以分为一般属性和私有属性。
通常,在类、对象中,如果一个属性名以__开头,则代表这个属性是私有属性,正常情况下是不可以在外部直接调用或修改该属性的。通过将属性设置成私有属性就是访问限制
访问限制是为了程序的健壮性,使得无法直接在外部修改某些特定的属性,保证了程序的正常运行。
举个例子,如果某个类中有个属性是用来存放年龄的,而有个方法需要用到这个年龄属性,并且是将这个年龄作为了除数,如果不小心设置或者输入年龄为0,那么就会导致程序出错。
对于某些比较重要的属性,我们如果想要用户能够获取到或者修改,则可以通过自定义方法实现,比如:getage、setage。通过方法设置属性可以进行参数检查,避免传入错误或无效的参数。
定义私有变量

class Person:def __init__(self):self.name = 'lucy'self.__age = 10p = Person()
ic(p.name)
ic(p.__age)

17:09:42|> p.name: ‘lucy’
Traceback (most recent call last):
File “E:\t1.py”, line 12, in
ic(p.__age)
AttributeError: ‘Person’ object has no attribute ‘__age’

我们可以看到,可以在外部直接获取到属性name,但是无法获取到属性__age
通过方法获取属性

from icecream import icclass Person:def __init__(self):self.name = 'lucy'self.__age = 10def getage(self):return self.__agep = Person()
ic(p.getage())

17:28:25|> p.getage(): 10

通过方法修改属性

from icecream import icclass Person:def __init__(self):self.name = 'lucy'self.__age = 10def getage(self):return self.__agedef setage(self, age):if isinstance(age, int) and 0 < age < 150:self.__age = ageelse:ic('输出的年龄有误,请核对!')p = Person()
p.setage(20)
ic(p.getage())
p.setage(200)
ic(p.getage())

18:03:42|> p.getage(): 20
18:03:42|> ‘输出的年龄有误,请核对!’
18:03:42|> p.getage(): 20

4.1.2 封装

在python中,封装是一种代码组织技术,可用于将数据和关联的方法(函数)作为一个单元进行管理。可以通过在类中定义公共方法来控制对类成员变量的访问,并保护它们免受不必要的修改。
封装有以下作用:

  • 将数据与相关行为捆绑在一起,以方便管理和维护代码。
  • 隐藏具体实现细节,使得代码更加安全和抽象化。
  • 通过只暴露有限的接口来减少代码的复杂度,提高代码的可读性和可维护性。
  • 改进了软件模块之间的互操作性和协作能力,使得软件更加可扩展和灵活。
    在python中,可以使用特殊的命名约定来模拟私有成员。我们可以在名称前加上双下划线"__",这样就可以防止其他人意外地访问到该成员,并且只能通过类中定义的公共方法来访问。
class Car:# 定义类私有变量__max_speed = 0__mileage = 0def __init__(self):# 初始化变量self.__max_speed = 200self.__mileage = 10# 定义公共方法def drive(self):print('Driving. Max speed:', self.__max_speed)# 定义getter和setter方法def get_max_speed(self):return self.__max_speeddef set_max_speed(self, speed):self.__max_speed = speedcar = Car()
print(car.get_max_speed()) # 输出200
car.set_max_speed(250)
car.drive() # Driving. Max speed: 250

在上面的代码中,Car 类定义了两个私有变量 __max_speed 和 __mileage,这些变量只能在类的内部使用。然后,我们定义了一个公共方法 drive(),它可以在类的外部访问,并且使用getter和setter方法来管理变量 __max_speed 的值。这样,我们就可以通过类的公共接口访问其数据和方法,而不需要直接访问其私有变量。


http://www.ppmy.cn/news/566424.html

相关文章

印刷企业使用MES生产管理系统后,会出现哪些弊端

MES生产管理系统是一种用于企业管理、控制和优化生产过程的管理软件。在印刷企业中&#xff0c;印刷MES管理系统可以帮助企业更好地管理生产过程&#xff0c;提高生产效率和质量。但是&#xff0c;在使用印刷MES管理系统时&#xff0c;也会存在一些弊端。本文将探讨这些弊端&am…

使用Python和Selenium自动化爬取 #【端午特别征文】 探索技术极致,未来因你出“粽” # 的投稿文章

文章目录 介绍&#xff1a;界面展示知识点详解导入相关模块设置Chrome驱动程序的路径创建ChromeDriver服务和启动Chrome浏览器发送GET请求获取网页内容模拟向下滚动加载更多内容获取完整的HTML内容关闭浏览器使用正则表达式提取文章信息构建数据表格和导出到Excel 扩展知识点代…

短信验证码的防攻击

案例 看到下面一个请求包,发个验证码附带了这么多的参数,那么肯定是有些问题滴!! 一般比较典型的短信轰炸漏洞,要么是未作任何限制,要么是添加 +、空格等可以绕过 最近在测试的时候,发现了一点新东西,利用请求中的其他参数也可以造成短信轰炸漏洞,比如说: 场景 …

vue3 + TS + Vue3 BaiduMap Gl 丝滑根据ip获取定位

官网 添加链接描述 安装 # with npm npm install vue3-baidu-map-gllatest --save# or with yarn yarn add vue3-baidu-map-gllatest# or with pnpm pnpm add vue3-baidu-map-gllatest配置 导入 import { createApp } from vue import App from ./App.vue import baiduMap f…

中移链链账户、合约与资源关系介绍

中移链链账户是在中移链区块链上注册的用户标识&#xff0c;每个账户可以持有一定数量的资源。CPU资源是账户用于执行智能合约的计算能力配额&#xff0c;决定了账户可以使用的CPU计算时间。NET资源是账户的带宽配额&#xff0c;用于处理事务的传输和网络通信。RAM资源用于存储…

基于Springboot+vue+协同过滤+前后端分离+电子产品推荐系统(用户,多商户,管理员)+全套视频教程

基于Springbootvue协同过滤前后端分离电子产品推荐系统(用户,多商户,管理员)(毕业论文11000字以上,共33页,程序代码,MySQL数据库) 代码下载 链接&#xff1a;https://pan.baidu.com/s/1ckCKm4zKT0m4RqfHULYyOg 提取码&#xff1a;8888 【运行环境】Idea JDK1.8 Maven MySQL …

堆——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容仍旧是二叉树&#xff0c;此刻分享的内容是一种特殊的二叉树&#xff0c;也就是堆了。下面&#xff0c;让我们进入堆的世界吧&#xff01;&#xff01;&#xff01; typedef int HeapDataType; typedef struct Heap {HeapDa…

mysql 集群实验~~双主双从搭建

这里写目录标题 搭建mysql集群实现双主双从的同步一、部署环境1.1 分别安装mysql服务并设置域名解析 二、 配置双主MySQL服务器2.1由于是双主&#xff0c;所以master2是master1的从&#xff0c;同时master1又是master2的从所以都要开启二进制和中继日志2.2 重启服务2.3 测试双主…