Python中私有属性的访问机制与命名混淆规则详解

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

本文深入解析Python中私有属性的实现机制。通过双下划线__前缀定义的属性并非绝对私有,而是通过命名混淆(Name Mangling)机制实现。文章演示了如何访问父类私有属性、子类继承中的表现,并指出Python遵循“我们都是同意的成年人”哲学,不强制语法层面的私有保护,仅用于避免名称冲突。

Python私有属性的基本概念

在定义类时,开发者常需创建辅助性的私有属性。其他编程语言通常使用private关键字明确修饰私有属性。然而,不同语言对私有属性的处理存在差异:部分语言实现的是真正的私有属性,而另一些则仅模拟私有行为。

以OC开发为例,其私有属性属于假私有,可通过runtime机制轻松获取并修改。相比之下,同源的Swift语言中,私有属性为真私有,必须依赖private关键字进行修饰。

在Python开发中,定义私有属性的约定是在属性名前添加两个下划线,例如__age即表示该属性为私有。

这种机制下,该属性是真正的私有还是模拟的私有?

私有属性的访问与修改

首先定义一个类,并在初始化方法中设置两个属性,其中包含一个私有属性。代码如下:


class Person(object):
# 构造函数
def __init__(self, name):
    self.name = name
    self.__age = 18

创建对象实例,并初始化name属性。


obj = Person("lily")
print(obj.name)

运行该模块,控制台将输出:lily

那么,如何访问这个私有属性?

尝试执行:print(obj.__age)

运行模块后,控制台报错显示:

'Person' object has no attribute '__age'

这表明,作为私有属性,它不能通过常规方式直接访问。

正确的调用方式是利用Python的命名混淆机制:

执行:print(obj._Person__age)

此时控制台可正常打印出:18

同样,也可以对私有属性进行重新赋值。

执行:obj._Person__age = 20

再次打印:print(obj._Person__age)

控制台输出更新后的值:20

子类继承中的私有属性处理

若创建另一个类并继承自Person,应如何访问自身的私有属性并进行修改?


class Student(Person):
    def __init__(self):
        self.__gender = 'male'
        stu = Student()
        print(stu._Student__gender)

控制台将输出:male

如果尝试访问父类的私有属性呢?

执行:print(stu._Person__age)

此时控制台报错:'Student' object has no attribute '_Person__age'

这进一步证实了私有属性无法被子类直接继承访问。

Python私有属性的设计哲学

由此可见,Python中的私有属性属于假私有属性。为何Python不在语法层面严格保证private字段的私密性?简而言之,Python的设计哲学是“We are all consenting adults here”(我们都是同意的成年人)。正如Python社区的观点:开放优于封闭。

综上所述:

Python编译器无法严格强制private字段的私密性。

仅在子类不受开发者控制时,才建议使用私有属性来避免名称冲突。

错误示例与总结

实例扩展:


#! encoding=UTF-8
 
class A:
  def __init__(self):
    
    # 定义私有属性
    self.__name = "wangwu"
    
    # 普通属性定义
    self.age = 19
    
a = A()
 
# 正常输出
print a.age
 
# 提示找不到属性
print a.__name

执行输出结果如下:

Traceback (most recent call last): File "C:\Users\lee\Documents\Aptana Studio 3 Workspace\testa\a.py", line 19, in <module> print a.__name AttributeError: A instance has no attribute '__name'

至此,关于Python调用私有属性的方法总结完毕。如需了解更多相关Python私有属性内容,请搜索本站历史文章或继续阅读后续文章。感谢大家的支持!

本站声明

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

Python 相关产品和应用

全部下载

专题列表