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亦举荐这种运用方式。
|