python 封装_python是怎么实现封装的

17df1baaacddfd6f990b9d0422d27a2b.png

8ab861558d4c5b7d6abf76c1d89a2d52.png

Python并没有提供类似于其他语言的private等修饰符,因此Python并不能真正支持隐藏。为了隐藏类中的成员,Python玩了一个小技巧:只要将Python类的成员命名为以双下划线开头的,Python就会把它们隐藏起来。推荐:Python教程例如,如下程序示范了Python的封装机制:cla

dabdf71ee379ce7b7ab44d35bc9a6a26.png

57e18154b0d3c9e73c52bcd2f0561816.png

python 并没有提供类似于其他语言的 private 等修饰符,因此 Python 并不能真正支持隐藏。为了隐藏类中的成员,Python 玩了一个小
技巧:只要将 Python 类的成员命名为以双下划线开头的,Python 就会把它们隐藏起来。
推荐:python教程
例如,如下程序示范了 Python 的封装机制:
123456789101112131415161718192021class User :    def __hide(self):        print('示范隐藏的hide方法')    def getname(self):        return self.__name    def setname(self, name):        if len(name)  8:            raise ValueError('用户名长度必须在3~8之间')        self.__name = name    name = property(getname, setname)    def setage(self, age):        if age  70:            raise ValueError('用户名年龄必须在18在70之间')        self.__age = age    def getage(self):        return self.__age    age = property(getage, setage)# 创建User对象u = User()# 对name属性赋值,实际上调用setname()方法u.name = 'fk' # 引发 ValueError: 用户名长度必须在3~8之间
上面程序将 User 的两个实例变量分别命名为 __name 和 __age,这两个实例变量就会被隐藏起来,这样程序就无法直接访问 __name、__age 变量,只能通过 setname()、getname()、setage()、getage() 这些访问器方法进行访问,而 setname()、setage() 会对用户设置的 name、age 进行控制,只有符合条件的 name、age 才允许设置。
上面程序尝试将 User 对象的 name 设为 fk,这个字符串的长度为“2”不符合实际要求,因此运行程序**后一行包含如下错误:
1ValueError:用户名长度必须在3-8之间
将**后一行代码注释掉,并在程序尾部添加如下代码:
1234u.name = 'fkit'u.age = 25print(u.name) # fkitprint(u.age) # 25
此时程序对 name、age 所赋的值都符合要求,因此上面两行赋值语句完全可以正常运行。运行上面代码,可以看到如下输出结果:
12fkit25
从该程序可以看出封装的好处,程序可以将 User 对象的实现细节隐藏起来,程序只能通过暴露出来的 setname()、setage() 方法来改变 User 对象的状态,而这两个方法可以添加自己的逻辑控制,这种控制对 User 的修改始终是安全的。上面程序还定义了一个 __hide() 方法,这个方法默认是隐藏的。如果程序尝试执行如下代码:
12# 尝试调用隐藏的__hide()方法u.__hide()
将会提示如下错误:
1AttributeError:'User' object has no attribute 'hide'
**后需要说明的是,Python 其实没有真正的隐藏机制,双下画线只是 Python 的一个小技巧,Python 会“偷偷”地改变以双下画线开头的方法名,会在这些方法名前添加单下画线和类名。因此上面的 __hide() 方法其实可以按如下方式调用(通常并不推荐这么干):
12# 调用隐藏的__hide()方法u._User__hide()
运行上面代码,可以看到如下输出结果:
1示范隐藏的hide方法
通过上面调用可以看出,Python 并没有实现真正的隐藏。
类似的是,程序也可通过为隐藏的实例变量添加下画线和类名的方式来访问或修改对象的实例变量。例如如下代码:
1234# 对隐藏的__name属性赋值u._User__name = 'fk'# 访问User对象的name属性(实际上访问__name实例变量)print(u.name)

f4d9f9e3461714ea156805f808a90b36.gif

动力猫机器人教育专注于青少年STEAM教育、创客教育产品及课程体系的开发,为3-18岁学生提供全方位STEAM创客教育课程解决方案。
目前公司已取得多项发明专利、实用新型专利及多项软件著作权专利,拥有上百种控制器、传感器等电子模块,近300种机械结构件,兼容国内外主流编程软件,能够实现较为复杂的物联网和人工智能项目的模型搭建,能充分满足教学、比赛、创新创意等多种需求。
      公司产品进入了中国电子学会发起的“全国青少年机器人技术等级考试”准用器材系列,自主研发软件Scraino已经写入山东中小学三个版本的信息技术课本,在天津、河北、山东等地开展培训中心业务,为美国加州中小学课堂提供产品。
     动力猫课程依托自身强大的研发实力,软硬件相结合,软件方面拥有业界领先的 Scraino(具有自主产权)图形化编程软件以及配套的电子件(各类传感器及控制器等);硬件采用硬件采用动力猫的idea-x积木,该积木具有多项国家发明专利,六面拼插,多方式组合,围绕6-18岁适龄儿童在教具器材、编程平台、评价机制及课程体系、技能等级评测、科技创意赛事等领域多元化搭建教育平台。其 Scraino、Python 课程,不仅能编程,还能通过自主研发的 Nano 控制器,各类传感器,实现机器人物联网课程学习,搭建属于自己的智慧机器人。

声明:编辑此文是出于传递更多信息之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与本号联系,我们将及时更正、删除,谢谢。

cf88aa3a6a3b4020e29870c704e3a941.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值