Python 封装

当使用像 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 类和私有变量