Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)

news2024/9/26 5:15:47

目录

前言:

1.添加特有属性/方法

示例1:添加特有属性

 示例2:添加特有方法

2.私有属性/方法

(1)私有化示例 

(2) 私有化属性/方法可以在类的内部使用

(3)强制访问私有化属性/方法

(4)@property装饰器去操作私有属性/方法

总结:


前言:

        前面我们学了Python中的属性和方法的定义,但是这些属性和方法都是公有的,也就是说我定义单个或者多个实例对象,这些实例对象都共有这个类的属性和方法,同时还可以去访问这些属性和方法。(上一期链接Python进阶-----面向对象1.0(对象和类的介绍、定义)_Python欧尼酱的博客-CSDN博客)下面给个例子:

class People:
    ty='人类'
    def __init__(self,name,age,gander):
        self.name=name
        self.age=age
        self.gander=gander
    def fun(self):
        print('电话号码****')
        print(f'我的年龄{self.age}')

a=People('Jack',15,'male')
print(a.ty)
print(a.name,a.age,a.gander)
a.fun()
#输出结果:人类
# Jack 15 male
# 电话号码****
# 我的年龄15

这里可以看出,这个实例对象的所有属性和方法都可以被访问到,这个类的属性和方法都是公开的,并不是特有的。

1.添加特有属性/方法

当我们建立了一个实例化对象之后,我们可以去手动添加在对象的属性和方法,这个添加之后的方法或者属性都是这个对象特有的,如果我们去建立另外一个对象,这个对象是不能访问上一个对象的特有属性或者方法。

示例1:添加特有属性

class People:
    def __init__(self, name, age, gander):
        self.name = name
        self.age = age
        self.gander = gander
    def fun(self):
        print('电话号码****')
        print(f'我的年龄{self.age}')
a = People('Jack', 15, 'male')
b=  People('Amy',16,'fmale')
a.father='Tom'
print(a.__dict__)
print(b.__dict__)
print(b.father)#报错:'People' object has no attribute 'father'
#输出结果:{'name': 'Jack', 'age': 15, 'gander': 'male', 'father': 'Tom'}
#         {'name': 'Amy', 'age': 16, 'gander': 'fmale'}

这里可以看到,我给对象a添加了father属性,然后通过__dict__方法去查看这些属性,对比与对象b发现多了一个father属性,那么这个属性就是对象a特有的属性,那么如果我去用对象b查询b.father 那么结果就会报错

 示例2:添加特有方法

class People:
    def __init__(self, name, age, gander):
        self.name = name
        self.age = age
        self.gander = gander
    def fun(self):
        print('电话号码****')
        print(f'我的年龄{self.age}')
def specific():
    print('this is a specific function')
a = People('Jack', 15, 'male')
b= People('Amy',16,'fmale')
b.specific=specific
b.specific()
#a.specific() #报错:'People' object has no attribute 'specific'
#输出结果:this is a specific function
#可以通过以下的方法,查询到对象a和对象b支持的功能和方法,很显然就可以看出specific()方法是谁特有的
# print(dir(b))
# print(dir(a))

这里可以看出我给对象b添加了特有的方法specific(),所以对象b是可以去调用这个方法的,而对象a是不可以去调用的,否则就会报错

2.私有属性/方法

         所谓的私有,也就是在所有数据中,特别设置了某一些数据不可查询,也就是加密的意思。在现实生活中,相关部门,例如医院,他们获取了我们个人信息,名字,性别,年龄,手机号,身份证号码等等,但是这些部门在一些平台的展示的时候不会吧全部信息给展示出来(例如年龄,身份证号码等等),而是说张某,李某等,这就是一种加密私有的过程。在Python类中把一些属性或者方法给加密(私有)化,让建立的实例对象无法访问这些属性或者方法,这就是一个私有化的过程。

 Python中私有化的定义:

实例对象__属性名/方法名

(也就是在属性名字或者方法名字的前面加上两个_(下划线)

作用功能:
前面以医院的例子说了,可以把一些信息加密私有化,起到保护作用,在Python也是一样的,都是起保护作用,不公开一些比较重要的信息

(1)私有化示例 

 示例1:属性私有化

class People:
    def __init__(self, name, age, gander):
        self.name = name
        self.__age = age #这里把年龄信息给加密私有化
        self.gander = gander
    def __user_info(self): #这里吧方法给加密私有化
        print('电话号码****')
        print(f'我的年龄{self.age}')
    def fun(self):
        print('the user')
user=People('Jack',20,'male')
print(user.name) #输出结果:Jack
print(user.gander) #输出结果:male
print(user.__age) #报错: 'People' object has no attribute '__age'

这里我给age进行私有化,但是我输出照样按照__age 去输出,结果报错说这个属性不存在,这也说明这个属性是无法查询的

示例2:方法私有化

class People:
    def __init__(self, name, age, gander):
        self.name = name
        self.__age = age #这里把年龄信息给加密私有化
        self.gander = gander
    def __user_info(self): #这里吧方法给加密私有化
        print('电话号码****')
        print(f'我的年龄{self.age}')
    def fun(self):
        print('the user')
user=People('Jack',20,'male')
user.fun() #输出结果:the user
user.__user_info() #报错:'People' object has no attribute '__user_info'

这里可以看出,__user_info() 私有化后是无法调用的,这样写的好处就是到时候我们学到面对对象的封装时,就可以把相关的信息进行私有化封装,避免重要信息泄露,提高保护性

(2) 私有化属性/方法可以在类的内部使用

        在定义类的过程中,一些私有化属性或者方法可以在类的内部进行调用,而在外部的实例对象是不可以去访问调用的(例子在上面)。

示例: 

class People:
    def __init__(self, name, age, gander):
        self.name = name
        self.__age = age #这里把年龄信息给加密私有化
        self.gander = gander
    def __user_info(self): #这里吧方法给加密私有化
        print('电话号码****')
        print(f'我的年龄{self.__age}')
    def __fun(self):
        print('the user')
    def using(self):#在类的内部定义一个方法去调用私有化方法/属性
        self.__fun()
        self.__user_info()
a=People('John',22,'male') #外部的实例对象是无法调用私有化属性/方法的
a.using() 
#输出结果:
# the user
# 电话号码****
# 我的年龄22

(3)强制访问私有化属性/方法

        私有化了相关属性/方法之后,难道就无法访问了吗?那当然不是了,如果真的无法访问那与其去私有化,那还干脆不如不写,其实Python中是可以通过一些方法去强制访问私有化属性或者方法的。那这样做其实是比较考验程序员的道德水平的哈,一般情况下我们虽然可以通过一些渠道去访问一些信息,但是真的没这个必要,这对其他人不好,所以在以后工作和生活的时候很不建议去强制访问相关重要信息。回归话题,现在是在学习Python嘛,哪有什么重要信息嘛,所以这些方法还是要学习的

 通过dir()可以去查询到一个对象可以支持的方法,这里可以看出这里前面两个有_People__的方法,其实我们就可以去通过这个方法来查询使用一些私有化数据或者方法。

格式:

实例对象_类名__属性/方法

实例:

class People:
    def __init__(self, name, age, gander):
        self.name = name
        self.__age = age #这里把年龄信息给加密私有化
        self.gander = gander
    def __user_info(self): #这里吧方法给加密私有化
        print('电话号码****')
        print(f'我的年龄{self.__age}')
    def fun(self):
        print('the user')
user=People('Tom',20,'male')
print(user._People__age) #强制访问属性
user._People__user_info()  #强制访问方法
#输出结果:20
#       电话号码****
#       我的年龄20

(4)@property装饰器去操作私有属性/方法

        @property装饰器可以去实现将一个方法变成属性,这个属性但是又不完全是属性,这个转换之后的属性是具有方法的效果。这样可以提供操作效率,可以让操作者明显感觉得到正在操作的不是一个方法而是一个属性。

用法:

Python中提供了@property 获取方法的返回值属性,@方法名.setter 设置方法返回的属性值,@方法名.deleter 删除方法中的返回值

 示例:

class Test:
    def __init__(self,score):
        self.__score=score
    @property #装饰器把下面这个方法转换为一个具有方法效果的属性
    def getscore(self): #定义一个方法
        if self.__score>=60:
            return f'及格,分数为{self.__score}'
        return '不及格'
Tom=Test(50)
print(Tom.getscore)

这里的初始化score是50分,然后返回的是不及格,但是如果我们想去修改或者删除这个分数的话,我们就要用到@getscore.setter和@getscore.deleter装饰器方法

class Qian(Kang):
    def fun(self):
        print('第二次改革')

class Test:
    def __init__(self,score):
        self.__score=score
    @property #装饰器把下面这个方法转换为一个具有方法效果的属性
    def getscore(self): #定义一个方法
        if self.__score>=60:
            return f'及格,分数为{self.__score}'
        return '不及格'
    @getscore.setter
    def setscore(self,newscore):
        print('分数已修改')
        self.__score=newscore
    @getscore.deleter
    def delscore(self):
        print('分数已删除')
        del self.__score
Tom=Test(50)
#触发property装饰器,查询结果
print(Tom.getscore)
#触发setter装饰器
Tom.setscore=66
print(Tom.getscore)
#触发deleter装饰器
del Tom.delscore
print(Tom.getscore) #这里分数已经被删除了就会报错,'Test' object has no attribute '_Test__score'

其实@property装饰器的功能还有很多很多,我这里也就是用property装饰器去实现类中的方法转换为具有方法效果的属性功能,其他的我就不多说了,如果想了解更多关于property装饰器的可以去看看这个链接http://t.csdn.cn/4Ey3m

总结:

属性和方法是面向对象重要组成部分,其分为共有、特有、私有

共有所有同一个类的实例对象都可以访问

特有虽然同一个类的实例对象,但是有些属性是某一个实例对象特有的,其他实例对象是无法访问的

私有私有是在类中定义的,把相关属性/方法设置为不允许访问,同一个类的实例对象都具有它们的私有属性,但是不允许访问

 好了,这一期就到这里了,下课!

分享一张壁纸~

 

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

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

相关文章

一:BT、BLE版本说明及对比

蓝牙版本说明1.常见名词说明2.BT&BLE特性对比3.BT各版本对比4.BLE各版对比1.常见名词说明 名称说明BR(Basic Rate)基本码率EDR(Enhanced Data Rate)增强码率BLE(Bluetooth Low Energy)低功耗蓝牙HS(High Speed)高速蓝牙BT(BlueTooth)蓝牙技术LE(Low Energy)低能耗AFH(Adap…

态路小课堂丨光模块使用可能遇到的4大问题以及注意事项!

光模块作为光通信系统的核心器件,其内部集成了精密的光学元件和电路元件。在日常使用过程中如果不按规定操作,很容易导致光模块损坏。本文态路通信为您介绍光模块在使用时可能遇到的问题,以及我们应该注意的事项。以此来减少光模块使用寿命&a…

Spring 事务(编程式事务、声明式事务@Transactional、事务隔离级别、事务传播机制)

文章目录1. 事务的定义2. Spring 中事务的实现2.1 MySQL 中使用事务2.2 Spring 中编程式事务的实现2.3 Spring 中声明式事务2.3.1 声明式事务的实现 Transactional2.3.2 Transactional 作用域2.3.3Transactional 参数设置2.3.4 Transactional 异常情况2.3.5 Transactional 工作…

桑基图绘制

绘制桑基图 但是关于数据流上的数据标签可能还得用ps… 注意 1、节点(nodes)要包括各层的,且不能重复,需要自己在后边append几个数据 2、数据流的数据要是整数,不能时numpy 3、注意表格加入时要再由array转为list&a…

大数据技术之Maxwell入门案例学习

大数据技术之Maxwell入门案例学习 文章目录大数据技术之Maxwell入门案例学习1、写在前面2. Maxwell 使用2.1 Maxwell 安装部署2.2 Maxwell 入门案例2.2.1 监控 Mysql 数据并在控制台打印2.2.2 监控 Mysql 数据输出到 kafka2.2.3 监控 Mysql 指定表数据输出控制台2.2.4 监控 Mys…

分布式监控系统——Zabbix(4)可视化、模板和用户参数

文章目录分布式监控系统——Zabbix(4)可视化、模板和用户参数一、zabbix可视化1.简介2.自定义图形(Graphs)3.聚合图形(Screens)4.幻灯片演示(Slide shows)5.定义拓扑图(M…

企业电销如何获得高质量精准流量,大数据获客直击精准客流

随时社会的发展,时代的进步,各行各业都在崛起,竞争力愈演愈烈,那么为了使自己的品牌得到更多人的关注,自己的产品可以更好的销售,无数的老板在想各种缤纷的办法让自己赚钱,百度竞价,…

图像处理│一张自拍即可实现变老变年轻,带你感受时光流逝之美

✨ 目录🎈 项目效果🎈 环境搭建🎈 下载PaddleGAN🎈 安装飞浆🎈 生成图片潜码🎈 老龄化处理🎈 年轻化处理🎈 项目效果 飞浆是一个由百度推出的深度学习开发平台,为开发者…

Ep_MySQL基础-存储引擎

show engines; //查看mysql所支持的存储引擎,以及从中得到mysql默认的存储引擎 MyIsam存储引擎:(非聚集索引)->数据索引不在一起 Innodb存储引擎:(聚集索引)->数据索引在一起 MyISAM 每个MyISAM数据表,皆由存储在硬盘上的3个文件所组成, .f…

光学设计软件Ansys的Lumerical 2023版本下载与安装使用

文章目录前言一、许可管理工具安装二、许可管理器配置三、Lumerical安装四、工具使用配置总结前言 Lumerical是一款功能强大的软件,用于设计和分析从组件到系统阶段的光子学和电磁学。这个版本的Lumerical改进了电子和光子学设计工具,用于复杂光子学&am…

【JAVA程序设计】【C00108】基于Springboot+Vue前后端分离的民宿短租预约管理系统

基于SpringbootVue前后端分离的民宿短租预约管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于Springbootvue开发的民宿短租预订管理系统,共分为三种权限:系统管理员、商家、用户 管理员角色包含以下功能: 个人中心、修改密码…

C++——优先级队列(priority_queue)的使用及实现

目录 一.priority_queue的使用 1.1、基本介绍 1.2、优先级队列的定义 1.3、基本操作(常见接口的使用) 1.4、重写仿函数支持自定义数据类型 二.priority_queue的模拟实现 2.1、构造&&重要的调整算法 2.2、常见接口的实现 push() pop() top() empt…

2023爬虫学习笔记 -- 多线程操作

一、定义一个程序开始时间程序开始时间time.time()二、创建几个网址,模拟目标网站网址列表[http://www.baidu.com,http://www.sogou.com,http://www.163.com]三、创建一个函数访问网站,模拟爬取数据操作(耗时操作)头{ "User-…

【C++】讲的最通透最易懂的关于结构体内存对齐的问题

目录1. 内存对齐规则2. 简单易懂的内存对齐示例2.1 简单结构体2.2 含位域的结构体2.3 空类的大小2.4 嵌套结构体3. 为什么需要内存对齐?4. 类型在不同系统下所占字节数1. 内存对齐规则 第一个成员在与结构体变量偏移量为0的位置处。其他成员变量要对齐到某个数字&a…

学了很久python却什么都做不了?这个方法一定要试试

很多人学了两三个月的python却什么都做不了,但有的人只学了不到一个月的时间,就可以开始自己做项目或者接私活,这是为什么? 作为20年码龄的老程序员,龙叔我觉得除了内在原因外,学习资源占据着大头。拥有好的…

NOC2021年测试卷2

一、单选题(共25题,每题2分,共50分) 1. 执行下面程序,屏幕上最多会看到多少个苹果?( ) A、10个B、11个C、1个D、无法确定2. 关于下面程序,说法正确的是 ?( ) 3. “角色1”要在“角色2”说完话后才能开始动作,如果“角色2”思考2秒钟,然后说3秒钟,那么“角…

【干货】又是一年跳槽季!Nginx 10道核心面试题及解析

Nginx是一款轻量级的高性能Web服务器和反向代理服务器,由俄罗斯的Igor Sysoev开发。它具有占用资源少、高并发、稳定性高等优点,被广泛应用于互联网领域。在Nginx的面试过程中,面试官通常会提出一些核心问题,本文将介绍一些常见的…

【手把手教会数据类型的存储】

数据类型介绍整型在内存中的存储:原码、反码、补码大小端字节序介绍及判断浮点型在内存中的存储解析1.数据类型介绍我们已经学习过了基本的数据类型:整型:shor —— 短整型int —— 整型long —— 长整型long long —— 更长的整型浮点型&…

机器学习 | 线性回归(单变量)

前文回顾:机器学习概述📚线性回归概念我们要使用一个数据集,数据集包含俄勒冈州波特兰市的住房价格。在这里,我要根据不同房屋尺寸所售出的价格,画出我的数据集。比方说,如果你朋友的房子是 1250 平方尺大小…

数据仓库之建模理论以及仓库设计思想

1、数据仓库 1.1、数据仓库概述 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据,借助数据仓库的分析能力,企业可从数据中获得宝贵的信息进而改进决策。同时,随着时间的推移,数…