零基础学习 Python 之封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013486414/article/details/84982183

写在之前

今天来讲 OOP 的最后一个特性:「封装」。封装是对具体对象的一种抽象,简单来说就是将某些部分隐藏起来,在程序外部看不到,这个看不到不是说人用眼睛看不到那个代码,其含义是其它的程序无法调用。

封装

想要了解封装,就免不了要提到「私有化」。私有化就是将类或者函数中的某些属性限制在某个区域内,从而让外部无法调用。

Python 中私有化的方法相对来说也比较简单,就是在准备私有化的属性或方法名字前面加上双下滑线。我们来看下面的例子:

class Sample:
   def __init__(self):
       self.my_name = 'rocky'
       self.__name = 'snow'

   def __python(self):
       print('i love python')

   def use_code(self):
       print('which is your love?')
       self.__python()

if __name__ == "__main__":
   s = Sample()
   print(s.my_name)
   print(s.__name)

然后我们来运行一下,看一下结果:

rocky
Traceback (most recent call last):
 File "test.py", line 16, in <module>
   print(s.__name)
AttributeError: Sample instance has no attribute '__name'

竟然报错了,我们查看一下报错的信息,显示的是我们没有 __name 属性。果然前面加上双下划线以后就被隐藏了,在类的外面无法被调用,我们再来试试那个函数是否可以使用,修改一下:

class Sample:
   def __init__(self):
       self.my_name = 'rocky'
       self.__name = 'snow'

   def __python(self):
       print('i love python')

   def use_code(self):
       print('which is your love?')
       self.__python()

if __name__ == "__main__":
   s = Sample()
   s.use_code()
   s.__python()

s.use_code() 的结果是要打印两句话: “which is your love?” 和 “i love python”,use_code() 方法和 __python() 方法是在同一个类中,可以调用。后面的 s.__python() 试图调用被私有化的方法,我们运行一下来看结果:

which is your love?
i love python
Traceback (most recent call last):
 File "test2.py", line 16, in <module>
   s.__python()
AttributeError: Sample instance has no attribute '__python'

还是报错,告诉我们没有找到 __python 方法。你看,我们是如愿以偿,该调用的调用,该隐藏的隐藏了。虽然用上面的方法确实的做到了「封装」,但是如果我们想要调用那些私有属性的时候该怎么办?Python 当然给我们想了办法,使用 property 装饰器。我们来看下面的例子:

class Sample:
   def __init__(self):
       self.my_name = 'rocky'
       self.__name = 'snow'

   @property
   def name(self):
       return self.__name

if __name__ == "__main__":
   s = Sample()
   print(s.name)

运行的结果如下:

snow

从上面的结果可以看出,用了 @property 这个装饰器以后,在调用那个方法的时候,用的是 s.name 的形式,这就好像是在调用一个属性一样,跟前面例子中的 s.my_name 的格式一样。

看来,封装的确不是让人 “看不见” 啊。

写在之后

到这,OOP 的三大特性就全部说完了,不知道前面的两个「继承」 和 「多态」你还记得么?不记得的回头再去看看前面两天的文章。

更多内容,欢迎关注公众号「Python空间」,期待和你的交流。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013486414/article/details/84982183
今日推荐