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

2023-10-30

目录

前言:

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 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

总结:

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

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

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

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

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

分享一张壁纸~

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 《机器学习有意思! 01》- 世界上最简单的机器学习入门

    本文首发于https jizhi im blog post ml is fun 01 你是否也曾听人们谈起机器学习但是只有一个朦胧的概念 你是否厌倦了在同事的高谈阔论中颓然欲睡 此诚求变之机 本教程适合所有对机器学习感到好奇 却不知从何下手
  • js的垃圾回收机制

    js 垃圾回收机制 GC 1 GC garbage collection js具有 自动 垃圾回收机制 即执行环境会负责管理代码执行过程中使用的内存 2 GC会定期 周期性的 找出那些不再继续使用的变量 然后释放其内存 3 不再使用的变量即
  • MySQL之explain 的type列 & Extra列

    explain 可以分析 select 语句的执行 即 MySQL 的 执行计划 一 type 列 MySQL 在表里找到所需行的方式 包括 由左至右 由最差到最好 All index range ref eq ref const syst
  • QT 基础布局类总结

    文章目录 系列文章目录 前言 一 水平布局 二 垂直布局 三 网格布局 总结 前言 1 水平布局 垂直布局 网格布局均放置于QGroupBox中 2 继承QWidget类 在构造函数中调用setLayout 函数 即可完成布局 一 水平布局
  • 经典面试智力题200+题和解答

    招聘时期到了 总少不了需要准备智力题 考来考去大多是各种旧题 本来是考智力的事情 现在几乎已经变成了题海战术的考试 所以我们也不能在这一块落后 学习各种奇巧淫技 扩展一下思路 同时免得笔试面试吃亏 搜集了大量智力题 有些还挺有意思 顺便活跃
  • EnPass+WebDAV(一个跨平台密码管理解决方案)

    使用 EnPass密码管理软件 和 坚果云WebDAV 服务来搭建一个跨平台的密码管理方案 前言 相信很多人仍然处于 一个密码走天下 这一状态 但这种情况在当今互联网时代无异于裸奔 各种服务器漏洞造成的密码泄露 还有 撞库 等连锁反应 所以
  • 如何巧妙拒绝别人,搭配Online有小妙招

    相信很多人都会有拒绝别人的烦恼 一旦开口拒绝 难免会得罪人 如果答应下来 自己又无力帮助 这时往往存在矛盾冲突关系 那么如何解决这个问题呢 搭配Online提醒您要注意巧妙拒绝方面的技巧啦 1 耐心倾听对方的请求 即使心里清楚自己最后要拒绝
  • 新榜

    在过去的一个月中 淄博烧烤的相关话题霸屏网络 这些媒介话题里承载了多少受众的向往与想象 根据2022年淄博市文旅局公开年报 去年 淄博官方就着力融媒体 在抖音 快手等平台创新使用 淄博到底有多牛 主题形式 通过视频内容和文案策划 长效推广淄
  • Simpsons’ Hidden Talents【KMP模板题】

    Homer Marge I just figured out a way to discover some of the talents we weren t aware we had Marge Yeah what is it Homer
  • 区块链的数据是存储在链上,还是在数据库中?(答案是这个问题并不成立,来一起了解一下吧)

    很多人都想了解区块链的数据到底什么时候是存储在链上 什么时候又储存在相应节点的数据库中间呢 今天我们就来解决这个有趣的问题 首先我们必须了解清楚两个概念 区块链数据 链上数据 首先 区块链数据包括区块数据和状态数据两者 区块数据描述的实际是
  • hive分区表详细介绍

    一 什么是分区表以及作用 数据分区的概念以及存在很久了 通常使用分区来水平分散压力 将数据从物理上移到和使用最频繁的用户更近的地方 以及实现其目的 hive中有分区表的概念 我们可以看到分区具重要性能优势 而且分区表还可以将数据以一种符合逻
  • Datalore安装使用教程

    发现一个jetbrain出的好东西 使用体验完爆jupyter notebook以及jupyter lab的软件 就是安装有点复杂 官网写得有点不清楚 这里简单介绍一下 首先他只能在linux运行 其他环境暂时不支持 首先 去https w
  • react简要分析

    一 简介 前段时间看到一个用33行代码就实现了一个非常基本的react代码 感觉还是蛮有趣的 代码如下 其主要实现了两大功能 生成虚拟DOM 根据虚拟DOM渲染出真实的DOM 无注释版 https github com leontrolsk
  • linux下查看物理CPU个数、核数、逻辑CPU个数

    cat proc cpuinfo中的信息 processor 逻辑处理器的id physical id 物理封装的处理器的id core id 每个核心的id cpu cores 位于相同物理封装的处理器中的内核数量 siblings 位于
  • 消息队列中间件 - 详解RabbitMQ6种模式

    RabbitMQ 6种工作模式 对RabbitMQ 6种工作模式 简单模式 工作模式 订阅模式 路由模式 主题模式 RPC模式 进行场景和参数进行讲解 PHP代码作为实例 安装 客户端实现 添加扩展 执行composer phar inst
  • 《计算机网络—自顶向下方法》 Wireshark实验(七):以太网与ARP协议分析

    1 以太网 1 1 介绍 以太网是现实世界中最普遍的一种计算机网络 以太网有两类 第一类是经典以太网 第二类是交换式以太网 使用了一种称为交换机的设备连接不同的计算机 经典以太网 是以太网的原始形式 运行速度从 3 10 Mbps 不等 交
  • 51单片机实战 1 --四个独立按键控制四位数码管

    本文基于普中51开发板 在其例程代码稍加改动而成的 单片机的入门小项目也很益智 启动单片机 四位数码管显示0000 按下s1并松开 显示1000 再按下s1并松开显示2000 连续10次按下并松开s2 数码管显示2100 2200 2300
  • WSL安装图形界面

    效果如下 1 下载并安装VcXsrv 链接如下 https sourceforge net projects vcxsrv 下载完安装一路next即可 或者自行选择安装路径 2 安装桌面环境 安装xfce4 terminalsudo apt
  • mysql的锁

    锁 锁机制用于管理对共享资源的并发访问 用来实现事务的隔离级别 锁类型 共享锁和排他锁都是行级锁 MySQL当中事务采用的是粒度锁 针对表 B 树 页 B 树叶子 节点 行 B 树叶子节点当中某一段记录行 三种粒度加锁 共享锁 S 可理解为
  • Python进阶-----面向对象2.0(特有属性和方法与私有属性和方法)

    目录 前言 1 添加特有属性 方法 示例1 添加特有属性 示例2 添加特有方法 2 私有属性 方法 1 私有化示例 2 私有化属性 方法可以在类的内部使用 3 强制访问私有化属性 方法 4 property装饰器去操作私有属性 方法 总结