当使用像 Python 这样的面向对象编程语言时,Python 中的封装是需要理解的 4 个重要概念之一。另外三个是继承、多态和抽象。
什么是封装?
当使用类和处理敏感数据时,提供对程序中使用的所有变量的全局访问并不是一个好的选择。封装为我们提供了一种访问所需变量的方法,而无需为程序提供对任何这些变量的完整访问。
可以通过使用专门为此目的定义的方法来更新、修改或删除变量中的数据。使用这种编程方法的好处是改进对输入数据的控制并提高安全性。
Python 中的封装是什么?
封装的概念在所有面向对象的编程语言中都是相同的。当这些概念应用于特定语言时,就会看到差异。
与 Java 等为变量和方法提供访问修饰符(公共或私有)的语言相比,Python 提供对全局所有变量和方法的访问。
检查下面的演示,了解如何轻松访问变量。
class Person: def __init__( self , name, age = 0 ): self .name = name self .age = age def display( self ): print ( self .name) print ( self .age) person = Person( 'Dev' , 30 ) #accessing using class method person.display() #accessing directly from outside print (person.name) print (person.age) |
输出
Dev 30 Dev 30 |
由于 Python 中没有访问修饰符,因此我们将使用几种不同的方法来控制 Python 程序中变量的访问。
控制访问的方法
Python 提供了多种方法来限制程序中的变量和方法访问。让我们详细了解一下这些方法。
使用单下划线
识别私有变量的常见 Python 编程约定是在变量前添加下划线前缀。现在,这对编译器方面来说并没有真正产生任何影响。该变量仍然可以像往常一样访问。但作为程序员已经接受的约定,它告诉其他程序员变量或方法只能在类的范围内使用。
请参阅下面的示例:
class Person: def __init__( self , name, age = 0 ): self .name = name self ._age = age def display( self ): print ( self .name) print ( self ._age) person = Person( 'Dev' , 30 ) #accessing using class method person.display() #accessing directly from outside print (person.name) print (person._age) |
输出
Dev 30 Dev 30 |
很明显,变量访问没有改变。但我们能做些什么来真正使其私有化吗?让我们进一步看看。
使用双下划线
如果你想将类成员(即方法和变量)设置为私有,那么你应该在它们前面加上双下划线。但 Python 为 private 修饰符提供了某种支持。这种机制称为名称修改。这样,仍然可以从外部访问类成员。
名称修改
在Python中,任何带有__Var的标识符都会被Python解释器重写 为_Classname__Var,并且类名仍然是当前的类名。这种更改名称的机制在 Python 中称为“Name Mangling”。
在下面的示例中,在 Person 类中,年龄变量已更改,并且其前缀为前导双下划线。
class Person: def __init__( self , name, age = 0 ): self .name = name self .__age = age def display( self ): print ( self .name) print ( self .__age) person = Person( 'Dev' , 30 ) #accessing using class method person.display() #accessing directly from outside print ( 'Trying to access variables from outside the class ' ) print (person.name) print (person.__age) |
输出
Dev 30 Trying to access variables from outside the class Dev Traceback (most recent call last): File "Person.py" , line 16 , in <module> print (person.__age) AttributeError: 'Person' object has no attribute '__age' |
您可以观察到变量仍然可以使用方法来访问,方法是类的一部分。但是你不能直接从外部访问年龄,因为它是一个私有变量。
使用 Getter 和 Setter 方法访问私有变量
如果要访问和更改私有变量,应使用访问器(getter)方法和修改器(setter 方法),因为它们是类的一部分。
class Person: def __init__( self , name, age = 0 ): self .name = name self .__age = age def display( self ): print ( self .name) print ( self .__age) def getAge( self ): print ( self .__age) def setAge( self , age): self .__age = age person = Person( 'Dev' , 30 ) #accessing using class method person.display() #changing age using setter person.setAge( 35 ) person.getAge() |
输出
Dev 30 35 |
Python 封装的好处
封装不仅可以确保更好的数据流,还可以保护数据免受外部来源的影响。封装的概念使得代码自给自足。它在实施层面非常有帮助,因为它优先考虑“如何”类型的问题,而忽略了复杂性。您应该将数据隐藏在单元中,以便于封装并确保数据的安全。
Python中需要什么封装
以下原因说明了为什么开发人员发现封装很方便,以及为什么面向对象的概念优于许多编程语言。
- 封装有助于在每个应用程序中实现明确定义的交互。
- 面向对象的概念侧重于 Python 中代码的可重用性。(干——不要重复)。
- 可以安全地维护应用程序。
- 它通过适当的代码组织保证了代码的灵活性。
- 它为用户带来流畅的体验,而不会暴露任何后端复杂性。
- 它提高了代码的可读性。代码某一部分的任何更改都不会干扰另一部分。
- 封装确保数据保护并避免数据的意外访问。可以使用上面讨论的方法来访问受保护的数据。
Python中的封装是,数据隐藏在对象定义之外。它使开发人员能够开发用户友好的体验。这也有助于保护数据免遭泄露,因为代码高度安全,外部来源无法访问。
参考文献:Python 类和私有变量