私有属性和方法的使用 | 学习笔记

简介: 快速学习 私有属性和方法的使用

开发者学堂课程【Python入门 2020年版私有属性和方法的使用】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/639/detail/10380


私有属性和方法的使用


内容介绍:

一.  定义方法

二.  私有属性的使用

三.  获取私有变量的方式

四.  私有函数


在实际开发中,对象的某些属性或者方法可能只希望在对象的内部别使用,而不希望在外部被访问到,这时就可以定义私有属性和私有方法。


一、定义方法

在定义属性或方法时,在属性名或者方法名前增加两个下划线 __ ,定义的就是私有属性或方法。

class Person;

def __init__( self , name , age):

self.name = name

self.age = age

self._money = 2000# 使用 __ 修饰的属性,是私有属性

def __shopping(self, cost):

self.__money -= cost# __money只能在对象内部使用

print('还剩下%d'%self.__money)

def test(self):

self.__shopping(200)  # __shopping方法也只能在对象内部使用


二、私有属性的使用

如有有一个变量只想在内部使用而不想被外部使用就可以把这个变量定义为私有变量。

class Person(object):

def __init__(selfname,age) :

self.name = name

self.age = age

self.__money = 1000  # 以两个下划线开始的变量是私有变量

p=Person("张三"18)

print(p.name, p.age)  # 可以直接获取到

# print(p.__money)  # 不能够直接获取到私有变量

image.png

在写完代码之后,p 指向了一个内存空间,内存空间里有 name agename age 是普通的属性,可以直接获取。

除了这个之外在 python 里还有私有属性,以两个下划线开始的变量是私有变量。 __money 是一个私有变量,不能通过 p 直接获取。


三、获取私有变量的方式

python 里很多私有的规定并不是真的私有,在程序里面很多时候所谓的私有变量都是可以通过多种方式获取到的。

1. 使用 对象._类名__私有变量名获取

print(p._Person__money)  # 通过这种方式也能获取到私有属性

class Person(object):

def __init__(selfname,age) :

self.name = name

self.age = age

self.__money = 1000# 以两个下划线开始的变量是私有变量

def test(self):

self.__money += 10# 在这里可以访问私有属性

私有的属性在外面不能访问但是在类里是可以访问的。写下 p.test() 本来有1000块钱运行之后就变成了1010块钱。

2. 定义 get set 方法来获取

image.png

在外面想访问 money 可以定义一个函数,这个函数可以被用户调用也可以访问到 money ,这个函数叫接口函数。接口可以被用来让前端页面和后端服务器之间传递数据。

class Person(object) :

def ___init__(self,name,age):

self.name = name

self.age = age

self._money = 1008#以两个下划线开始的变量是私有变量

def get_money(self):

return self._money

想要获取money可以使用 print(p.get_money())

import datetime

class Person(object):

def _init__(self,name,age) :

self.name = name

self.age = age

self._money = 1000  # 以两个下划线开始的变量是私有变量

def get_money(self):

print(‘{}查询了余额’.format(datetime. datetime.now()))

return self.__money

创建私有变量并使用函数调用的目的是为了记录很多信息

import datetime

class Person(object):

def _init__(self,name,age) :

self.name = name

self.age = age

self._money = 1000  # 以两个下划线开始的变量是私有变量

def get_money(self):

print(‘{}查询了余额’.format(datetime. datetime.now()))

return self.__money

def set_money(self,qian) :

if type(qian) != int:

print('设置的余额不合法")

return

print('修改余额了')

self._money = qian

想要修改钱数可以输入 p.set_money() ,如果修改了余额运行后就会显示修改余额了。

如果输入 p.set_money(hello)把钱改成了字符串,那么就会显示设置的余额不合法并且钱数不做更改。

1. 使用 property 来获取(有机会的话补充)


四、私有函数

以两个下划线开始的函数,是私有函数,在外部无法调用

class Person(object):

def _init__(self,name,age) :

self.name = name

self.age = age

self._money = 1000  # 以两个下划线开始的变量是私有变量

def _demo(self):  # 以两个下划线开始的函数,是私有函数,在外部无法调用

print("我是 demo 函数, name=f .format( self.name ))

def test(self):

self.__demo()

p. __demo()  # 不能直接调用demo 函数,它是私有方法

p._Person __demo()  # 可以通过Person

相关文章
|
Docker 容器
如何提高Docker的下载速度-----配置加速器
在正常情况下,docker默认连接的国外官方镜像,在国外的网友访问该官方镜像自然不成问题,中国的网络访问国外官方镜像网速一向很慢,而且往往还会遭遇断网的窘境。docker pull 国内网络链接失败或很卡慢,一般都需要更换至国内。
15757 1
|
SQL 关系型数据库 MySQL
MySQL数据库——视图-检查选项(cascaded、local)
MySQL数据库——视图-检查选项(cascaded、local)
561 0
|
11月前
|
人工智能 并行计算 算法
LLM-04 大模型 15分钟 FineTuning 微调 ChatGLM3-6B(准备环境) 3090 24GB实战 需22GB显存 LoRA微调 P-TuningV2微调
LLM-04 大模型 15分钟 FineTuning 微调 ChatGLM3-6B(准备环境) 3090 24GB实战 需22GB显存 LoRA微调 P-TuningV2微调
301 0
|
传感器 编解码 API
【STM32开发入门】温湿度监测系统实战:SPI LCD显示、HAL库应用、GPIO配置、UART中断接收、ADC采集与串口通信全解析
SPI(Serial Peripheral Interface)是一种同步串行通信接口,常用于微控制器与外围设备间的数据传输。SPI LCD是指使用SPI接口与微控制器通信的液晶显示屏。这类LCD通常具有较少的引脚(通常4个:MISO、MOSI、SCK和SS),因此在引脚资源有限的系统中非常有用。通过SPI协议,微控制器可以向LCD发送命令和数据,控制显示内容和模式。
471 0
|
SQL 运维 DataWorks
Flink CDC在阿里云DataWorks数据集成应用实践
本文整理自阿里云 DataWorks 数据集成团队的高级技术专家 王明亚(云时)老师在 Flink Forward Asia 2023 中数据集成专场的分享。
1667 2
Flink CDC在阿里云DataWorks数据集成应用实践
|
监控 应用服务中间件 nginx
使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kibana)
ELK的架构有多种,本篇分享使用的架构如图所示: Beats(Filebeat) -> -> Elasticsearch -> Kibana,目前生产环境一天几千万的日志,内存占用大概 10G
937 4
|
Docker 容器
Docker安装ClickHouse
Docker安装ClickHouse
|
算法 Java BI
Sentinel为什么这么强,我忍不住扒了扒背后的实现原理
大家好,我是三友~~ 最近我在整理代码仓库的时候突然发现了被尘封了接近两年之久的Sentinel源码库 两年前我出于好奇心扒了一下Sentinel的源码,但是由于Sentinel本身源码并不复杂,在简单扒了扒之后几乎就再没扒过了 那么既然现在又让我看到了,所以我准备再来好好地扒一扒,然后顺带写篇文章来总结一下。
Sentinel为什么这么强,我忍不住扒了扒背后的实现原理
|
算法 自然语言处理 机器学习/深度学习
中文竞技场大模型测评后续之双模型匿名对话
在中文竞技场大模型测评的延续中,我们将在双模型匿名对话技术场景中,通过趣味游戏方式对写作创作、代码相关、知识常识等领域进行全面测评
739 0
中文竞技场大模型测评后续之双模型匿名对话