Python面向对象编程:类的封装、私有属性与方法详解

Ivy
Ivy
发布时间:2026-10-14 | 4人浏览过
原创

本文深入解析Python面向对象编程中的类封装机制。详细讲解如何定义公开与私有类属性及实例属性,阐述双下划线命名约定对私有化的实现原理及其局限性。同时介绍私有方法的定义方式,以及Python解释器预留的特殊属性和方法(如__name__、__init__等)的作用,帮助开发者构建高内聚、低耦合的代码结构。

理解封装的核心概念

封装(Encapsulation)本质上是属性与方法的抽象过程。

在属性层面,封装涉及对类中变量(属性)的定义、隔离与保护。

属性访问权限主要分为两类:

  • 私有属性:仅限在类的内部进行访问。
  • 公开属性:可通过类名或对象实例进行访问。

开发者可根据需求选择公开或隐藏属性,其隐藏机制基于特定的命名约定。

在方法层面,封装涉及对类中函数(方法)的定义、隔离与保护。

方法访问权限同样分为两类:

  • 私有方法:仅限在类的内部进行调用。
  • 公开方法:可通过类名或对象实例进行调用。

开发者可选择公开或隐藏方法,从而隐藏其内部实现逻辑。

  • 封装的最终目标是构建一个对外可操作的属性和方法接口。

封装使得数据和代码结合为类的过程,其基本表达形式为:类——属性——方法。

深入解析私有与公开类属性及实例属性

2.1 公开类属性

公开类属性即普通的类属性,其语法结构如下所示。


class ClassName:
    <类属性名> = <类属性初值>
    def __init__(self,[参数1], [参数2], ...[参数n]):
        self.<实例属性名> = <实例属性初值>
    ...

2.2 私有类属性

私有类属性仅允许当前类访问,子类无法直接访问。其语法结构如下。


class ClassName:
    <__私有类属性名> = <私有类属性初值>
    def __init__(self,[参数1], [参数2], ...[参数n]):
        self.<实例属性名> = <实例属性初值>
    ...

可通过.<类属性>或者<对象名>.<类属性>的方式访问。

这种方式有效保证了属性维护的可控性。

示例代码如下:


class TestClass:
    __number = 0

    def __init__(self, num_value):
        for i in range(num_value + 1):
            TestClass.__number += i

    @classmethod  # 类方法
    def sum_number(cls):
        return TestClass.__number


value1 = TestClass(100)
print(TestClass.sum_number())  # 5050
# print(value1.__number)  # AttributeError: 'TestClass' object has no attribute '__number'

若在类外部访问.__number,将会抛出AttributeError异常。

2.3 公开实例属性

公开实例属性等同于普通实例属性,其语法结构如下。


class <类名>:
    <类属性名> = <类方法值>
    def __init__(self, <参数列表>):
        self.<实例属性名> = <实例属性值>
    ...

2.4 私有实例属性

私有实例属性仅能在当前类内部使用,子类同样无法直接访问。其语法结构如下。


class <类名>:
    <类属性名> = <类方法值>
    def __init__(self, <参数列表>):
        self.<__私有实例属性名> = <实例属性值>
    ...

可通过.<类属性>或者<对象名>.<类属性>的方式访问。

这种方式同样有效保证了属性维护的可控性。

示例代码:


class TestClass:

    def __init__(self, num_value):
        self.__number = 0
        for i in range(num_value + 1):
            self.__number += i

    def sum_number(self):
        return self.__number


value1 = TestClass(100)
print(value1.sum_number())  # 5050
# print(value1.__number)  # AttributeError: 'TestClass' object has no attribute '__number'

2.5 私有属性并非绝对私有

私有属性使用双下划线仅是一种转换约定,转换后类内原有名称发生变化,这属于形式上的私有。

示例代码:


class TestClass:

    def __init__(self, num_value):
        self.__number = 0
        for i in range(num_value + 1):
            self.__number += i

    def sum_number(self):
        return self.__number


value1 = TestClass(100)
print(value1.sum_number())  # 5050
print(value1._TestClass__number)  # 5050
# 可以通过 对象名._类名__属性 的方式来访问

实际上,可以通过对象名._类名__属性的方式来访问该属性。

深入解析私有方法与公开方法

定义方法即在类内部定义并使用的函数,其语法结构如下。


class <类名>:
    def <__私有方法名>(self, <参数列表>):
        ...

定义私有方法时,方法名前面需要添加两个下划线(__ )。

各类方法均可通过增加双下划线的方式转换为私有方法。

私有方法在形式上保护了Python类内部使用的函数逻辑。

私有属性与公开属性的区分主要基于程序员逻辑,而非安全逻辑,因此需重视命名约定。

类的保留属性解析

Python解释器预留了以双下划线开头或结尾的类属性,称为保留属性。

  • 保留属性也被称为特殊属性。
  • 其命名特征是以双下划线开头和结尾。
  • 其作用是为理解Python类提供统一的属性接口。
  • 这些属性值具有特殊含义,在类定义后可直接使用。

通常仅通过<类名>访问这些保留属性。

保留属性 描述
__name__ 类的名词
__qualname__ 以.分隔从模板全局命名空间开始的类名称
__bases__ 类所继承的基类名称

类的保留方法解析

保留方法是Python解释器预留的方法,以双下划线开头和结尾。

  • 保留方法也被称为特殊方法。
  • 其命名特征是以双下划线开头和结尾。
  • 其作用是为理解Python类提供统一的方法接口。
  • 方法逻辑具有特定含义,通常与操作符关联,类定义时往往需要重载这些方法。

至此,关于Python面向对象编程中类的封装内容介绍完毕。如需了解更多Python类封装相关知识,请搜索本站历史文章或继续浏览后续内容,感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表