零基础学习 Python 之封装

本文字数: 1830 字
阅读本文大概需要: 5 分钟
写在之前
今天来讲 oop 的最后一个特性:「封装」。封装是对具体对象的一种抽象,简单来说就是将某些部分隐藏起来,在程序外部看不到,这个看不到不是说人用眼睛看不到那个代码,其含义是其它的程序无法调用。
封装
想要了解封装,就免不了要提到「私有化」。私有化就是将类或者函数中的某些属性限制在某个区域内,从而让外部无法调用。
python 中私有化的方法相对来说也比较简单,就是在准备私有化的属性或方法名字前面加上双下滑线。我们来看下面的例子:
classsample:def__init__(self):self.my_name = 'rocky'self.__name = 'snow'def__python(self): print('i love python')defuse_code(self): print('which is your love?')self.__python()if __name__ == __main__: s = sample() print(s.my_name) print(s.__name)
然后我们来运行一下,看一下结果:
rockytraceback (most recent calllast):filetest.py, line 16, in print(s.__name)attributeerror: sampleinstance has noattribute'__name'
竟然报错了,我们查看一下报错的信息,显示的是我们没有 __name 属性。果然前面加上双下划线以后就被隐藏了,在类的外面无法被调用,我们再来试试那个函数是否可以使用,修改一下:
classsample:def__init__(self):self.my_name = 'rocky'self.__name = 'snow'def__python(self): print('i love python')defuse_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 pythontraceback (most recent calllast):filetest2.py, line 16, in s.__python()attributeerror: sampleinstance has noattribute'__python'
还是报错,告诉我们没有找到 __python 方法。你看,我们是如愿以偿,该调用的调用,该隐藏的隐藏了。虽然用上面的方法确实的做到了「封装」,但是如果我们想要调用那些私有属性的时候该怎么办?python 当然给我们想了办法,使用 property 装饰器。我们来看下面的例子:
classsample:def__init__(self):self.my_name = 'rocky'self.__name = 'snow' @propertydefname(self):returnself.__nameif __name__ == __main__: s = sample() print(s.name)
运行的结果如下:
snow
从上面的结果可以看出,用了 @property 这个装饰器以后,在调用那个方法的时候,用的是 s.name 的形式,这就好像是在调用一个属性一样,跟前面例子中的 s.my_name 的格式一样。
看来,封装的确不是让人 “看不见” 啊。
写在之后
到这,oop 的三大特性就全部说完了,不知道前面的两个「继承」 和 「多态」你还记得么?不记得的回头再去看看前面两天的文章。
我还是那句话,公众号是一个适合你在闲暇的时候用来碎片化学习的地方,我写的可能也会有一些遗漏的地方,想学习好一门编程语言,还是要多看书,多思考,重要的是多敲代码多实现,有时候看起来简单,真的到了需要实现的时候其实各种错误层出不穷。
如果你觉得本篇文章对你有所帮助的话,欢迎点赞转发,同时有什么问题欢迎和我交流。
the end。