3.2.5 从私有属性和私有方法体会封装特性

之前已经提到,私有属性无法在外部被调用,同样类里定义的私有方法也无法在外部被调用,而封装特性的精髓在于合理地定义类的私有属性和私有方法,从而屏蔽类的内部实现细节。

比如在使用汽车时,我们是通过钥匙来发动车,在发动时,或许汽车会通过发动机内部方法来发动,一般的做法是公开一个通过钥匙发动车的公有方法,同时把发动机内部发动的相关属性和方法定义成私有的。

如果把发动机相关的方法公开,从语法上看,不会有问题,但外部就有可能直接通过连接发动机线路等动作来发动车。这样不仅会提升发动汽车的复杂度,还会带来出现问题的可能性。

在如下的PrivateFuncDemo.py案例中,我们演示了私有方法的使用规范,从中大家可以进一步体会封装的重要性。


01 # coding=utf-8
02 class Car:
03     def start(self):
04         self.__startByEngine()
05         print('Start Car')
06     def __startByEngine(self):
07         print('Start Car By Engine ')
08 myCar = Car()
09 myCar.start() # 正确的用法
10 # myCar.__startByEngine() # 语法错误
11 myCar._Car__startByEngine() # 不推荐的做法

在第2行定义的Car类里,我们在第3行定义了公有的start方法,并调用第6行的__startByEngine私有方法来发动汽车。注意,第6行的私有方法也是以__开头的。

在第9行里,通过公有的start方法来发动汽车,这是正确的用法。在第10行里,企图调用私有方法,这会报语法错误。同样,Python对于私有方法也会重命名,重命名的方式和私有属性的一致,都是_类名+私有方法名,如第11行所示,但不推荐通过这种方法来调用私有方法,因为这会破坏类的封装性。

最后再强调一下,在实际操作中,有些程序员会人为地把一些私有属性和私有变量提升为公有的,这虽然能方便一时,但是这种做法相当于让外部能随心所欲地访问或修改私有属性或私有变量,所以强烈不推荐。