Python 私有属性与私有方法详解:命名机制与访问限制

木白
木白
发布时间:2026-10-16 | 4人浏览过
原创

本文深入解析 Python 中私有属性与私有方法的定义语法及调用限制。通过双下划线前缀实现封装,Python 采用名称修饰机制将私有成员重命名为_类名__成员名。文章演示了外部访问私有成员时的 AttributeError 异常,并揭示通过修饰后名称绕过限制的原理,同时强调遵循封装规范的重要性。

1. 场景定义

私有属性:

在 Python 面向对象编程中,私有属性指那些仅允许在对象内部访问,而禁止从外部直接读取或修改的数据成员。

简而言之,私有属性是对象内部状态,不对外暴露。

私有方法:

在 Python 面向对象编程中,私有方法指那些仅允许在对象内部调用,而禁止从外部直接执行的函数或行为。

简而言之,私有方法是对象内部逻辑,不对外暴露。

2. 语法定义

在 Python 中,定义私有属性和私有方法需遵循特定语法规范:

class Staff:
    def __init__(self, s_name, s_salary):
      self.s_name = s_name
      self.__salary = s_salary
      
    def __secret(self):
      print("%s 的工资是 %d" % (self.s_name, self.__salary))
  • (1). 私有属性以两个下划线开头,例如 __salary。
  • (2). 私有方法以两个下划线开头,例如 __secret(self)。

3. 调用分析

(1). 在 __init__ 对象初始化方法中,以两个下划线开头的 __salary 被定义为私有属性。

尝试在对象外部直接访问该私有属性,观察访问结果。

运行结果显示,第 11 行代码在对象外部尝试访问私有属性 __salary 时,抛出 AttributeError 错误,提示 Staff 对象 zhangsan 没有属性 __salary。

为验证 Staff 类对象确实包含 __salary 实例属性,仅因外部访问受限,

将 self.__salary 修改为 :self.salary,并相应调整 __secret(self) 方法中对 self.__salary 的引用,观察如下运行结果。

结果显示,修改为非私有属性后,外部调用正常,未出现 AttributeError 错误。

(2). 在 __secret(self) 实例方法中,以两个下划线开头的 __secret(self) 方法被定义为私有方法。

沿用上述测试流程,先在对象外部尝试调用私有方法 __secret(self),观察调用结果。

运行结果显示,第 11 行代码在对象外部尝试访问私有方法 __secret(self) 时,抛出 AttributeError 错误,提示 Staff 对象 zhangsan 没有 __secret 方法。

为验证 Staff 类对象确实包含 __secret(self) 实例方法,仅因外部访问受限,

将 __secret(self) 方法修改为:secret(self),保持其他代码不变,观察如下运行结果。

结果显示,修改为非私有方法后,外部调用正常,未出现 AttributeError 错误。

(3). 从下图可见,在对象内部,私有方法与私有属性均可被正常调用。

如图中的 work 方法调用了私有方法 __secret(self),而私有方法 __secret(self) 调用了私有属性 __salary。

在对象外部,使用 Staff 类对象 zhangsan 调用 work 方法,可间接访问到对象内部的私有属性和私有方法。

控制台输出显示,work 方法能正常访问对象内部定义的私有属性和私有方法。

4. Python 伪私有属性和私有方法

Python 中不存在绝对意义上的私有,因为 Python 在命名属性与方法时进行了特殊处理,使得外部无法直接通过原名称访问。

以私有属性和私有方法为例,Python 内部处理方式为:

  • (1). 属性: __salary,处理后属性名为:_Staff__salary(格式为_类名__属性名)
  • (2). 方法: __secret,处理后方法名为:_Staff__secret(格式为_类名__方法名)

了解 Python 内部对私有属性和私有方法的处理机制后,尝试使用处理后的命名方式在对象外部访问,观察是否成功。

class Staff:
    def __init__(self, s_name, s_salary):
        self.s_name = s_name
        self.__salary = s_salary

    def __secret(self):
        return "%s的工资是 %d" % (self.s_name, self.__salary)


zhangsan = Staff("张三", 10000)
print(zhangsan._Staff__salary)
print(zhangsan._Staff__secret())

运行结果如下图所示:

控制台未抛出任何异常,之前的 AttributeError 错误消失。

此例证明 Python 没有真正意义上的私有,知晓内部处理机制后,仍可通过 _类名__属性名(方法名) 的方式在对象外部访问内部定义的私有属性和私有方法。

但日常开发中不推荐此方式,既然在对象内部定义属性和方法时已声明为私有,调用方应遵守封装规则。

至此,关于 Python 私有属性与私有方法的介绍结束,更多相关 Python 私有属性与私有方法内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表