外链论坛

 找回密码
 立即注册
搜索
查看: 37|回复: 2

三十4、Python面向对象:"假"封装

[复制链接]

3047

主题

119

回帖

9915万

积分

论坛元老

Rank: 8Rank: 8

积分
99159062
发表于 2024-8-17 21:17:37 | 显示全部楼层 |阅读模式

Python面向对象三大特征之封装

1.什么是封装?

众所周知,封装(Encapsulation)、继承(Inherit)和多态(Polymorphism)是面向对象的三大特征,它指的是将对象的状态信息隐匿在类定义的内部,不准许外界直接拜访对象的内部信息,而是经过该类对外边暴露的办法来实现对类内部信息的拜访和操作。

2.封装的好处

对外隐匿类内部的实现细节;运用者仅通经过类定义时对外暴露的办法拜访数据,因此呢能够在定义办法时添加掌控规律,限制对属性的不恰当拜访;在用户经过办法设置或修改类的属性时,能够办法上添加数据校验规则,能够保准数据的完整性和有效性;

3.怎么样实现封装?

实现封装能够从以下两方面来思虑

必须将对象的属性和实现细节隐匿起来,不准许外边直接拜访和操作;将办法暴露出来,让办法掌控这些属性的拜访与操作;

4.Python类中实现封装

由于Python是解释型的语言,并像其它语言供给变量的修饰符,例如private, protected等,而是经过一种技巧,即Python内部的约定,给类成员命名以双下划线的开头,Python就会将它们隐匿起来。

class Dog: def get_name(self): return self.__name def set_name(self, name): if(len(name)<2): raise ValueError(狗的名字最少必须两个汉字)self.__name = name name = property(get_name, set_name) def __pee(self): print(我要尿尿了...) # 实例化并调用 d = Dog() # 尝试直接给变量赋值 d.name = 泰迪 print(d.name) #d.name =狗 #print(d.name) # ValueError: 狗的名字最少必须两个汉字 #d.__pee() # AttributeError: Dog object has no attribute __pee

上面的例子中将Dog类的实例变量命名为__name, 这个实例变量就会被隐匿起来,这般,程序没法直接拜访该实例变量,只能经过get_name, set_name这些办法来进行拜访, 而get_name, set_name会添加掌控规律仅有符合要求的name才准许被设置。

另一针对隐匿办法__pee(), 程序尝试执行,因为办法在类的内部定义为隐匿因此直接拜访会报错。

5.为何说Python中的封装是“假”封装?

其实,Python其实真正的隐匿机制,双下划线实现隐匿在Python中只是一种技巧, 由于针对加了双下划线的变量和办法名,Python会巧妙地改名这个名字,即会在你定义的双下划线变量或办法前再添加单下划线和类名。能够经过"对象名.__dict__"查看,或经过"对象名._类名__[办法名|变量名]"调用:

class Dog: def get_name(self): return self.__name def set_name(self, name): if(len(name)<2): raise ValueError(狗的名字最少必须两个汉字) self.__name = name name = property(get_name, set_name)def __pee(self): print(我要尿尿了...) # 实例化并调用 d = Dog() d.name =泰迪 # 经过下面的办法能够查看被隐匿的成员变量和办法print(d._Dog__name) d._Dog__name=藏獒 print(d._Dog__name) d._Dog__pee()

查看隐匿变量和办法

因此,从上面能够看出,Python并真正地实现“隐匿”机制,是一种“”封装,然则咱们举荐这般拜访一般不会这么拜访

因此倘若必须隐匿变量或成员办法能够运用以“双下划线”命名的这种方式,Python举荐这种运用方式。





上一篇:中科院“自主研发”编程语言被指Python套壳,在中国,学术造假屡见不鲜
下一篇:少儿编程Python学什么?为您揭晓其中的奥秘!
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-9-9 00:03:19 | 显示全部楼层
我赞同你的看法,你的智慧让人佩服,谢谢分享。
回复

使用道具 举报

2996

主题

3万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109194
发表于 2024-11-2 04:26:18 | 显示全部楼层
我们有着相似的经历,你的感受我深有体会。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-23 05:14 , Processed in 0.097499 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.