24、Python之面向对象:责任与自由,私有属性真的有必要吗

引言

前面我们进一步介绍了类定义中属性的使用,今天我们对中关于属性私有化的话题稍微展开聊一下,顺便稍微理解一下Python设计的相关理念。

访问级别

在其他编程语言中,比如Java,关于类中的属性和方法通过关键字定义明确的访问级别,比如private表示私有级别,protected表示保护级别,public表示公共级别。访问级别控制了属性和方法在不同场景下能否被访问到。当然,这些访问级别并不是无懈可击的,我们通过反射机制还是可以突破访问级别的限制。

Python中的访问级别相对来说比较简单,只有公共级别和私有级别。要区分一个属性和方法的访问级别,是通过属性或方法的名称来判断,当名称是以__打头时,在Python中就被当做是私有的属性或方法了。

从其他语言相对看似严谨的数据访问级别的使用习惯转到Python,刚开始可能会觉得Python中的这种规则有些别扭,多用几次,也就慢慢习惯了。

Python私有属性的访问

当我们在Python中通过__打头定义一个属性或方法时,这个属性或方法就被定义为了私有,那么我们就不能通过对象名或者类名直接访问到这个私有的属性或方法了。

要实现私有属性或方法的访问,似乎就只能通过定义公有的方法间接进行访问了。以实际代码来举例说明一下私有属性的定义与访问:

class DaGongRen:
    def __init__(self, name, age, salary):
        self.name = name
        self.age = age
        self.__salary = salary

    def get_salary(self):
        return self.__salary


dgr = DaGongRen('张三', 18, 100)
# 我们可以通过公有的方法间接访问私有的属性
print(dgr.get_salary())
# 如果直接尝试通过对象.属性的方式访问私有属性,会报错
print(dgr.__salary)

执行结果:

345d9978248c771ac808b3a103e01495.jpeg

可以看到,无法通过对象名.属性名的方式直接访问私有属性了,可以通过定义一个公有的方法间接来访问私有属性。

Python私有属性的实现机制

在Python中,我们可以通过对象的__dict__属性,来查看一个对象中存在的属性。

回到前面的定义了私有属性的DaGongRen的代码,我们来查看一下__dict__属性:

dgr = DaGongRen('张三', 18, 100)
# 我们可以通过公有的方法间接访问私有的属性
print(dgr.get_salary())
# 如果直接尝试通过对象.属性的方式访问私有属性,会报错
# print(dgr.__salary)

print(dgr.__dict__)

执行结果:

3f0aa64ac6143b162e4ae932bb799c66.jpeg

可以看到,我们定义的两个公有属性name和age,同时多了一个莫名其妙的属性,_DaGongRen__salary,而这个属性的值刚好是私有属性__salary的值100。

其实在Python中是通过一种称之为“名称混淆(Name Mangling)”的机制来实现相关私有属性或方法的隐藏的。具体规则是在私有属性的名称前拼接上_类名作为最终的私有属性的名字。所以,我们直接对象名.属性名时,提示找不到这个属性,因为这个名字的属性确实不存在。

那么,如果我们是用名称混淆之后的私有属性名是否能直接访问到私有属性呢?通过代码来尝试一下:

print(dgr.__dict__)
# 通过名称混淆后的私有属性名进行访问
print(dgr._DaGongRen__salary)
dgr._DaGongRen__salary = 250
print(dgr.__dict__)
# 我们也可以通过__dict__进行字典的读写
print(dgr.__dict__['_DaGongRen__salary'])
dgr.__dict__['_DaGongRen__salary'] = 300
print(dgr.__dict__)
print(dgr.get_salary())

执行结果:

6ac69edce65de8fc49e75f4ee6625789.jpeg

自由与责任的理念

为什么只是进行名称混淆,而没有增加更加严格的私有数据的保护机制呢。

其实,类比于Java等语言的数据访问级别的控制,仍然可以通过反射来突破。Python中,更习惯于把开发者当做成年人来对待。一个属性应不应该随意更改,成年人自己说得算。

很像是奈飞的企业文化中所倡导的“自由与责任”:承担相应的责任,同时获得对应的自由。

现实中,很多规章制度似乎也是防君子不防小人。那么,实际开发场景中,所谓的私有属性,真的很有必要吗?

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫理的日知录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值