1. 编程学习网 > 编程教程 > Python教程 > python封装与私有化

python封装与私有化

封装与私有化
面向对象有三大特征分别是:封装、继承和多态。我们先来说说封装。

1.封装的概念

封装是对全局作用域中的除自身外其他区域隐藏多余的信息。像我们的函数,就是封装的一种应用。
在面向对象中,往往使用封装的方式将细节封装起来,对外只暴露相关的调用方法。比如一台遥控器,设计者只需要提供相应功能的按钮给使用者,而其内部的电路板等复杂的实现功能则将其隐藏,不提供给用户,这就是封装的思想。试想,如果将遥控器所有的内部实现细节连同功能一起暴露给用户,那么用户虽然可以随意修改里面的东西,但是却极其容易出问题,导致一系列不可预计的后果。
所以,封装要做的事就是把该隐藏的东西隐藏,把该暴露的东西暴露。

2.私有属性和私有方法

在python的面向对象程序设计中,对于类的中的成员没有像其他语言那么严格的访问控制符的限制(比如c++里的private),因为python程序的设计初衷就是“简洁”,类中定义的所有属性和方法默认都是公开的,如果想要隐藏其中的成员,方法是在需要隐藏的属性和方法名字前加上双下划线”__”将它们私有化。
关于私有化需要注意的是:私有属性只可以在类内部访问,在类的外部不能直接访问它们,不过可以通过“对象名._类名__私有属性名”的方式间接访问。

这个例子和我们之前举的例子中唯一差别就是在初始化方法中将变量age进行了私有化,如果没有这个私有化,程序是可以正常执行的,但是此时执行程序会发现第6行正常执行,第7行报错:
小明
Traceback (most recent call last):
  File "C:\Users\Lenovo\Desktop\text.py", line 9, in <module>
    print(a.age)
AttributeError: 'student' object has no attribute 'age'
报错原因提示:“学生”类中没有“年龄”属性,但是我们明明定义了age属性,它依然报错,这就是因为私有属性不能在类外直接访问只能在类内访问,不过下面的一行代码可以让我们在类外间接访问。
可以将第7行改为下面的语句运行程序。
print(a._student__age) 
其实属性和方法的本质是一样的,只不过方法是通过一个小括号()来执行,所以上述对于属性的操作也适合方法。


大家可以类比上例来理解这个小程序,我们在这里增加了一个私有化的方法,并且在里面可以直接访问私有属性age,因为他们同属一个类,然后此程序也验证了在类外不能直接调用私有方法只能间接调用。
不仅仅对于实例属性,类属性的操作也类似,比如在上述程序第2行前增加一个类变量将其私有化。

我们知道,如果类变量grade没有被私有化,则此程序第9行运行是没有问题的,但是现在只能通过调用类内可以访问私有属性的公开方法stu()来访问它,或者通过“对象名._类名__私有属性名”的方法来访问。
上述程序使用封装和私有化的方式可以保护类内不希望外界随意修改的属性和方法,大大增加程序的安全性。

Cookie:python中的下划线

1.    单前下划线”_name”
在一个模块中如何给一个变量命名成单下划线的方式时,在另一个模块中使用from ... import *的方式导入该模块时,单下划线的变量无法被导入。

程序第3行报错,这是因为单前缀下划线是python的一个命名约定,它表示该名称只能供内部使用。
其它情况与普通变量无异。
1.    双前下划线”__name”
变量名被私有化,只能在类内部直接使用。
2.    双前后下划线”__name__”
python中的特殊方法属性,比如构造方法、析构方法等,它们往往有比较特殊的使用情况,我们自己命名时应当避免这样的命名方式。
3.    后单下划线”name_”
与普通变量命名方式无异,只是python中约定,使用这种命名方式来避开和关键字冲突。比如:”def_”
4.    单下划线”_”
用作临时或无意义变量的命名,比如:仅仅需要做10次循环的时候--for _ in range(10)
在python 交互解释器下,又可以表示前一个表达式的结果,请打开python shell实验,如:


本文由IT教学网整理发布,转载请注明出处:http://www.itjx.com/jiaocheng/Python/2020/0118/532.html

联系我们

在线咨询:点击这里给我发消息

咨询电话:400-998-2681

工作时间:7*24小时无休