专栏首页Python空间零基础学习 Python 之封装

零基础学习 Python 之封装

本文字数: 1830 字

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

写在之前

今天来讲 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 的三大特性就全部说完了,不知道前面的两个「继承」 和 「多态」你还记得么?不记得的回头再去看看前面两天的文章。

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

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

The end。

本文分享自微信公众号 - Python空间(Devtogether),作者:Rocky0429

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 写个“类”就是这么 so easy

    在昨天的文章中(我与“类”的初次相见)我们学习了类的基本概念,并用伪代码简单的了解了类的基本的写法和形式,从现在开始我们不用伪代码了,开始用真正的 Python...

    Rocky0429
  • 零基础学习 Python 之嵌套函数

    我在几天以前的文章中(零基础学习 Python 之函数对象)说过,函数不单单可以作为对象来传递,还可以在一个函数里面嵌套一个函数,这个就是我们今天要讲的嵌套函数...

    Rocky0429
  • Python 黑魔法之属性拦截

    我们在昨天的文章(Python 黑魔法之内存优化)讲了一种黑魔法,今天我们来讲另一种:「属性拦截」。当我们访问某个类或者是实例属性的时候,如果它不存在的话,就会...

    Rocky0429
  • python 单实例运行

    用户5760343
  • @classmethod

    py3study
  • python 调用父类方法super()

    class A: def spam(self): print('A.spam')

    用户5760343
  • Python学习笔记整理(十六) 类的设计

    如何使用类来对有用的对象进行建模? 一、Python和OOP Python和OOP实现可以概括为三个概念。 继承     继承是基于Python中属...

    py3study
  • Python 学习笔记之类与实例

    类 (class) 封装一组相关数据,使之成为一个整体,并使用一种方法持续展示和维护。

    Python技术与生活认知的分享
  • Python类的内置方法

    本章介绍一下python类中的一些内置方法。内置的方法有很多,有些内置方法在object类中已经定义,子类可以拿来直接使用,也可以重写,但是有些内置方法obje...

    py3study
  • python第五十课——多态性

    hankleo

扫码关注云+社区

领取腾讯云代金券