前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python之伪私有属性

Python之伪私有属性

作者头像
数据山谷
发布2021-01-08 15:17:25
7700
发布2021-01-08 15:17:25
举报
文章被收录于专栏:数据山谷数据山谷

本章节主要讲解面向对象中的伪私有属性及其属性的修改办法。

私有属性

什么叫做私有属性?简单来说,就是该属性可以在类中可见,但是外部不可见,不可进行访问的属性就是私有属性。

实现方式

Python中定义私有属性时方法很简单,只需要在属性名或者函数名前加上“__“两个下划线即可,这样就实现了私有化的定义。接下来,咱们通过定义一个类,来看一下私有属性如何实现,下边代码是定义了一个叫做Person的类,继承object类,这样的类我们叫做新式类(在Python3中,我们默认都是新式类,Python3以前版本中类可以分成新式类和经典类两种,大家了解即可)。

代码语言:javascript
复制
# 定义一个关于人的类
class Person(object):
    def __init__(self,name,sex):
      # 定义公有属性
        self.name = name
        # 定义私有属性
        self.__sex = sex
person = Person("Joe","男")
person.name   # 输出的结果:'Joe'
person.__sex  # 输出显示报错如下:'Person' object has no attribute '__sex'

但是实际情况中,我们可能想要查看私有属性,这时可以如何操作?下边咱们提供3种方法。推荐使用方法3进行设置。

01

方法一

虽然无法直接查看私有属性,但是我们可以对私有属性__sex重新赋值,如:person.__sex = '女',然后再查看person.__sex即可成功查看,但是此种方式相当于在person中定义了一个名为__sex 的变量,所以这种方式不会改变类中真正的属性,即:’男‘。

代码语言:javascript
复制
person.__sex = ’女’
person.__sex  # 输出的结果:’女’

02

方法二

代码语言:javascript
复制
# 查看私有属性的方法二:
person._Person__sex  # 输出的结果:'男'
# 修改私有属性
person._Person__sex = '女' # 将私有属性改变成女
# 再次查看私有属性
person._Person__sex  # 输出的结果:'女'

经过上边代码的演示,我们知道:通过在属性名或者函数名前加上“__“两个下划线实现私有属性的方法,其实是一种伪私有属性,所谓的伪是指:这种私有属性是可以改变的。另外,这种方法主要是为了起到避免和外界代码变量产生混淆,防止意外错误发生。

python中使用name mangling技术,当使用“__“两个下划线定义私有属性时,程序会自动将原属性名变成_+classname(类名)+__原属性名,所以在外部使用原私有属性名时,提示找不到。相反,通过上边代码方式即可查看私有属性及对私有属性进行修改。

03

方法三

通过在方法上面添加 @property的方式(即:在方法上边应用装饰器)实现私有属性的定义和修改,该操作原理是:将方法封装成类属性,通过调用类属性的方式调用方法。在开发中,一般采用方法三进行设置。此外,property类中有相应方法。比如:setter 函数,下边通过代码来看一下代码如何制作和呈现。

代码语言:javascript
复制
# 定义一个关于人的类
class Person(object):
    def __init__(self,name,sex):
      # 定义公有属性
        self.name = name
        # 定义私有属性
        self.__sex = sex
        
    # 定义私有属性
    @property
    def sex(self):
        return self.__sex
   # 修改私有属性
    @sex.setter
    def sex(self,value):
        self.__sex = value  #修改原属性:sex
代码语言:javascript
复制
# 创建一个对象
person = Person("Joe","男")
# 查看私有属性sex
person.sex  # 输出的结果:'男'
# 修改私有属性sex
person.sex = "女"
# 再次查看私有属性
person.sex  # 输出的结果:'女'
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据山谷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档