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

Python 类的封装

作者头像
py3study
发布2020-01-10 17:05:15
1.4K0
发布2020-01-10 17:05:15
举报
文章被收录于专栏:python3python3

封装(Encapsulation)是对 object 的一种抽象,即将某些部分隐藏起来,在程序外部看不到,即无法调用(不是人用眼睛看不到那个代码,除非用某种加密或者混淆方法,造成现实上的困难,但这不是封装)。

要了解封装,离不开“私有化”,就是将类或者函数中的某些属性限制在某个区域之内,外部无法调用。

Python 中私有化的方法也比较简单,就是在准备私有化的属性(包括方法、数据)名字前面加双下划线。例如:

代码语言:javascript
复制
#!/usr/bin/env Python
# coding=utf-8
__metaclass__ = type
class ProtectMe:
    def __init__(self):
        self.me = "qiwsir"
        self.__name = "kivi"
    def __python(self):
        print "I love Python."
    def code(self):
        print "Which language do you like?"
        self.__python()
if __name__ == "__main__":
    p = ProtectMe()
    print p.me
    print p.__name

运行一下,看看效果:

代码语言:javascript
复制
$ python 21102.py
qiwsir
Traceback (most recent call last):
  File "21102.py", line 21, in <module>
    print p.__name
AttributeError: 'ProtectMe' object has no attribute '__name'

查看报错信息,告诉我们没有__name 那个属性。果然隐藏了,在类的外面无法调用。再试试那个函数,可否?

代码语言:javascript
复制
if __name__ == "__main__":
    p = ProtectMe()
    p.code()
    p.__python()

修改这部分即可。其中 p.code() 的意图是要打印出两句话:"Which language do you like?"和"I love Python.",code() 方法和__python() 方法在同一个类中,可以调用之。后面的那个 p.__Python() 试图调用那个私有方法。看看效果:

代码语言:javascript
复制
$ python 21102.py 
Which language do you like?
I love Python.
Traceback (most recent call last):
  File "21102.py", line 23, in <module>
    p.__python()
AttributeError: 'ProtectMe' object has no attribute '__python'

如愿以偿。该调用的调用了,该隐藏的隐藏了。

用上面的方法,的确做到了封装。但是,我如果要调用那些私有属性,怎么办?

可以使用 property 函数。

代码语言:javascript
复制
#!/usr/bin/env Python
# coding=utf-8
__metaclass__ = type
class ProtectMe:
    def __init__(self):
        self.me = "qiwsir"
        self.__name = "kivi"
    @property
    def name(self):
        return self.__name
if __name__ == "__main__":
    p = ProtectMe()
    print p.name

运行结果:

代码语言:javascript
复制
$ python 21102.py 
kivi

从上面可以看出,用了 @property 之后,在调用那个方法的时候,用的是 p.name 的形式,就好像在调用一个属性一样,跟前面 p.me 的格式相同。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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