Python类中私有属性与公共属性的区别及实现机制

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

本文深入解析Python中类的私有属性与公共属性。通过双下划线前缀定义私有属性,Python会在内部进行名称改写(Name Mangling)以限制访问。文章展示了直接访问私有属性及子类继承时的异常行为,并对比了单下划线与双下划线的区别,帮助开发者理解Python的封装机制。

Python类的私有属性与公共属性解析

在Python中,类的属性可见性主要划分为两种:公共(public)和私有(private)。

私有属性通过在属性名或方法名前添加两个下划线(__)来标识,而公共属性则无需此标识。

若在类外部直接尝试访问私有属性,程序将抛出异常。

class Base:
    def __init__(self, value):
        self.__value = value
 
b = Base(5)
print(assert b.__value)
 
Traceback (most recent call last):
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 19, in <module>
    print(b.__value)
AttributeError: 'Base' object has no attribute '__value'

即使是被子类继承,私有属性也无法被直接访问。

class Parent:
    def __init__(self, value):
        self.__value = value 
 
class Child(Parent):
    def get_value(self):
        return self.__value
 
child = Child(4)
print(child.get_value())
 
Traceback (most recent call last):
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 24, in <module>
    print(child.get_value())
  File "/Users/yangjiajia/Desktop/project/python/algebra/test.py", line 21, in get_value
    return self.__value
AttributeError: 'Child' object has no attribute '_Child__value'

这一现象源于Python对私有属性的名称改写机制。当编译器处理如Child.get_value方法访问私有属性时,会将__value转换为_Child__value进行查找,而父类中实际存储的私有属性名为_Parent__value。由于名称不匹配,子类无法直接访问父类的私有属性,这并非完全禁止访问,而是通过名称差异实现隔离。

可以通过查看对象的属性字典来验证这一机制。

class Parent:
    def __init__(self, value):
        self.__value = value 
 
class Child(Parent):
    def name(self):
        names = 'yang'
 
    def get_value(self):
        return self.__value
 
child = Child(4)
print(child.__dict__)
 
{'_Parent__value': 4}

Python的设计哲学建议少用私有属性。若仅需避免命名冲突,使用单个下划线前缀即可。

class Parent:
    def __init__(self, value):
        self._value = value 
 
class Child(Parent):
    def get_value(self):
        return self._value
 
child = Child(4)
assert child._value == 4

Python私有属性的定义方式

在Java等语言中,使用private关键字限定变量或方法,使其仅对类内部可见,外部不可访问。

Python中同样支持私有属性定义,通过在函数或属性名前添加两个下划线来实现。

例如,定义属性 __parameter。

接下来通过一个Dog类的示例进行说明。

class Dog(object):
    __slots__ = ('__name', 'kind', 'level')
    def __init__(self,name,kind,level):#构造函数,定义属性和初始方法
        self.__name=name
        self.kind=kind
        self.level=level#赋值
        print(f"This is a {self.kind} dog called {self.__name} with level {self.level}")
 
    def run(self):#定义类中的方法
        print(f"{self.__name} is now running!")
 
    def roll_over(self):
        print(f"{self.__name} is now rolling over!")
 
    def change_level(self):
        self.level+=1#修改类中属性的值
        print(f"The level of {self.__name} is now {self.level}")

在另一个文件中导入并调用该类。

from Zoo.Dog import Dog#导包
 
dog=Dog("Halo","Husty",3)#实例化
 
dog.run()
dog.roll_over()
dog.change_level()#调用方法

尝试执行特定代码时,会因非法访问私有属性而报错。

print(dog.__name)

在此例中,__name用于对name属性进行私有限定。

以上为个人经验分享,旨在提供参考,欢迎支持本站。

相关标签:

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

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 算法库。