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 中没有。
封装使你可以更好地控制代码中的耦合程度,它允许类更改其实现而不会影响代码的其他部分。