前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >零基础学习 Python 之封装

零基础学习 Python 之封装

作者头像
编程文青李狗蛋
发布2019-11-07 15:41:13
5170
发布2019-11-07 15:41:13
举报
本文字数: 1830 字

阅读本文大概需要: 5 分钟

写在之前

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

封装

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

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

代码语言:javascript
复制
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)

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

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

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

代码语言:javascript
复制
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() 试图调用被私有化的方法,我们运行一下来看结果:

代码语言:javascript
复制
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 装饰器。我们来看下面的例子:

代码语言:javascript
复制
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)

运行的结果如下:

代码语言:javascript
复制
snow

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

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

写在之后

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

我还是那句话,公众号是一个适合你在闲暇的时候用来碎片化学习的地方,我写的可能也会有一些遗漏的地方,想学习好一门编程语言,还是要多看书,多思考,重要的是多敲代码多实现,有时候看起来简单,真的到了需要实现的时候其实各种错误层出不穷。

如果你觉得本篇文章对你有所帮助的话,欢迎点赞转发,同时有什么问题欢迎和我交流。

The end。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python空间 微信公众号,前往查看

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

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

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