Python私有属性与方法详解:命名修饰机制与访问技巧

Luna
Luna
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python中私有属性和方法的实现机制。通过双下划线前缀定义私有成员,Python利用命名修饰(Name Mangling)技术将内部名称转换为`_类名__成员名`形式,从而在类外部阻止直接访问。文章演示了私有属性与方法的使用、报错原因及通过修饰后名称间接访问的技巧,帮助开发者理解Python的封装特性。

Python私有属性与方法详解:命名修饰机制与访问技巧

如何在Python中正确使用私有属性和方法


class File:

  def __init__(self, name):

    self.name = name

    self.code = "ABCDEF"

    

file_A = File("file_A")

私有属性的定义与访问限制

假设我们定义了一个名为File的类,并创建了一个实例对象file_A。

访问file_A.code

如果直接调用该属性,可以查看其内容。但若该属性包含敏感信息如密码,直接暴露是不安全的处理方式。


class File:

  def __init__(self, name):

    self.name = name

    self.__code = "ABCDEF"

    

file_A = File("file_A")

print(file_A.code)

为了防止信息泄露,可以在属性名前添加双下划线(__)将其设为私有,但此时直接调用会引发错误。


class File:

  def __init__(self, name):

    self.name = name

    self.__code = "ABCDEF"

    

file_A = File("file_A")

print(file_A.__code)

许多人误以为是因为外部调用时少写了下划线导致错误,实际上这是因为该属性已被定义为私有属性,标准访问方式被拦截。


class File:

  def __init__(self, name):

    self.name = name

    self.__code = "ABCDEF"

  def open(self):

    print("This is the AAA file!")

    

file_A = File("file_A")

file_A.open()

私有方法的实现与调用

除了属性,方法是否也能设置为私有?答案是肯定的。


class File:

  def __init__(self, name):

    self.name = name

    self.__code = "ABCDEF"

  def __open(self):

    print("This is the AAA file!")

    

file_A = File("file_A")

file_A.__open()

私有方法的处理结果与私有属性类似,直接调用同样会报错。


class File:

  def __init__(self, name):

    self.name = name

    self.__code = "ABCDEF"

  def __open(self):

    print("This is the AAA file!")

    

file_A = File("file_A")

print(file_A._File__code)

file_A._File__open()

通过命名修饰访问私有成员

在Python中,如果在方法或属性名前加上单下划线和类名(即使用命名修饰后的名称),就可以访问这些私有的属性和方法。

知识点扩展:

Python私有机制的核心原理

Python默认的成员函数和成员变量均为公开状态,且不像其他语言那样使用public或private等关键字进行修饰。在Python中,只需在变量名或函数名前添加两个下划线("__"),即可将其定义为私有。在内部,Python使用一种名为“命名修饰”(name mangling)的技术,将`__membername`替换为`_classname__membername`。因此,当你在类外部尝试使用原始私有成员名称时,系统会提示找不到该属性。例如:


class Person:

def __init__(self):
self.__name = 'haha'#私有属性
self.age = 22

def __get_name(self):##私有方法
return self.__name

def get_age(self):
return self.age

person = Person()
print person.get_age()
print person.__get_name()
运行结果是:22 Traceback (most recent call last): File "E:\pythoner\zenghe\jay.py", line 38, in print person.__get_name() AttributeError: Person instance has no attribute '__get_name'

这里定义的__name是私有属性,__get_name()是私有方法。如果直接访问,会提示找不到相关属性或方法。但如果确实需要访问私有数据,也是可行的。严格来说,私有方法在类外部是可以访问的,只是通过常规名称难以处理。在Python中,并没有绝对意义上的私有;内部通过改变和恢复私有方法及属性的名称,使得它们看似无法通过给定名称直接使用。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。