Python 封装

在面向对象的 Python 程序中,你可以*限制*对方法和变量的*访问*。这可以防止数据被意外修改,并称为*封装*。让我们从一个例子开始吧。

私有方法

封装对方法或变量的访问受限制

我们创建了一个类 Car,它有两个方法:drive()updateSoftware()。创建 Car 对象时,它将调用私有方法 __updateSoftware()

此函数不能直接在对象上调用,只能在类中调用。

#!/usr/bin/env python
 
class Car:
 
    def __init__(self):
        self.__updateSoftware()
 
    def drive(self):
        print 'driving'
 
    def __updateSoftware(self):
        print 'updating software'
 
redcar = Car()
redcar.drive()
#redcar.__updateSoftware()  not accesible from object.

该程序将输出:

updating software
driving

封装可防止不是无意的意外访问。

私有属性和方法并没有真正隐藏,它们被重命名,在名称的开头添加 _Car

实际上可以使用 redcar._Car__updateSoftware() 调用该方法

私有变量

具有私有变量的类

变量可以是私有的,可以在很多场合使用。私有变量只能在类方法中更改,而不能在类之外更改。

对象可以为你的应用程序保存关键数据,并且你不希望数据可以在代码中的任何位置更改。

一个例子:

#!/usr/bin/env python
 
class Car:
 
    __maxspeed = 0
    __name = ""
 
    def __init__(self):
        self.__maxspeed = 200
        self.__name = "Supercar"
 
    def drive(self):
        print 'driving. maxspeed ' + str(self.__maxspeed)
 
redcar = Car()
redcar.drive()
redcar.__maxspeed = 10  # will not change variable because its private
redcar.drive()

如果要更改私有变量的值,则使用 setter 方法。这只是一个设置私有变量值的方法。

#!/usr/bin/env python
 
class Car:
 
    __maxspeed = 0
    __name = ""
 
    def __init__(self):
        self.__maxspeed = 200
        self.__name = "Supercar"
 
    def drive(self):
        print 'driving. maxspeed ' + str(self.__maxspeed)
 
    def setMaxSpeed(self,speed):
        self.__maxspeed = speed
 
redcar = Car()
redcar.drive()
redcar.setMaxSpeed(320)
redcar.drive()

你为什么要创造它们?因为你可能希望在创建对象后更改某些私有值,而其他值可能根本不需要更改。

Python 封装

总而言之,在 Python 中有:

类型 描述
公共方法 可从任何地方访问
私人方法 只能在自己的类中访问。从两个下划线开始
公共变量 可从任何地方访问
私有变量 只能在自己的类中或通过定义的方法访问。从两个下划线开始

其他编程语言也有保护类方法,但 Python 中没有。

封装使你可以更好地控制代码中的耦合程度,它允许类更改其实现而不会影响代码的其他部分。