[00805]将名称封装到类中

本文介绍了如何在Python中使用单下划线和双下划线来封装类的私有数据,探讨了这两种方法的区别及应用场景,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将名称封装到类中

一、 解决问题

想封装类的实例上面的“私有”数据,但是Python语言并没有访问控制。

二、解决方案

单下划线(_)开始的名字应该总被认为只属于内部的

三、代码说明

#!/usr/bin/env python

class A:
    def __init__(self):
        self._internal = 0
        self.public = 1

    def public_method(self):
        """
            a public method
        """

    def _internal_method(slef):
        ;

"""
Python并不会真的阻止别人访问内部名称。但是如果你这么做肯定是不好的,
可能会导致脆弱的代码。

已下划线大头的标识也可以用于模块名称和模块级别的函数中。
如果见到一模块已_开始(_socket),则它属性内部实现。
比如 sys._getframe() 使用起来要特别注意
"""
class B:
    def __init__(self):
        self._private = 0

    def __private_method(self):
        ;

    def public_method(self):
        self.__private_method()

"""
双下滑线打头的名称会导致出现名称重整(name mangling)的行为。
也就是,这个类中的私有属性会被分别重命名为_B__private和_B__private_method
目的:
    为了继承,这样的属性不能通过继承覆盖。

"""

class C(B):
    def __init__(self):
        super().__init__()
        self._private = 1 # 并不是重写了B._private

"""
    私有名字_private 会被重命名为_C__private 和B中的重整名称不同。
"""

四、关联知识

五、总结

应该使用那个?

(1) 让非公有名称以单下划线开头。
(2) 如果涉及到子类化处理,而且有些内部属性应该对子类进行隐藏,那么就使用双下划线开始
(3) 为了解决和关键字冲突,可以使用 在关键字后面加一个下划线如   case_.

六、代码地址

github地址:https://github.com/weichen666/python_cookbooka>
目录/文件:eight_selection/learn_class_obj_underline.py

七、参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值