• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
李晓否
一个不应该编程的程序员
博客园    首页    新随笔    联系   管理    订阅  订阅
14、私有数据

Python 程序员不去依赖语言特性去封装数据,而是通过遵循一定的属性和方法命名规约来达到这个效果。第一个约定是任何以单下划线 _ 开头的名字都应该是内部实现。比如: 

class A:
    def __init__(self):
        self._internal = 0 # An internal attribute
        self.public = 1 # A public attribute
    def public_method(self):
        '''
        A public method
        '''
        pass
    def _internal_method(self):
        pass            

Python 并不会真的阻止别人访问内部名称。但是如果你这么做肯定是不好的,可能会导致脆弱的代码。同时还要注意到,使用下划线开头的约定同样适用于模块名和模块级别函数。例如,如果你看到某个模块名以单下划线开头 (比如 _socket),那它就是内部实现。类似的,模块级别函数比如 sys._getframe() 在使用的时候就得加倍小心了。
你还可能会遇到在类定义中使用两个下划线 (__) 开头的命名。比如:

class B:
  def __init__(self):
    self.__private = 0
  def __private_method(self):
    pass
  def public_method(self):
    pass
    self.__private_method()

使用双下划线开始会导致访问名称变成其他形式。比如,在前面的类 B 中,私有属性会被分别重命名为 _B__private 和 _B__private_method 。这时候你可能会问这样重命名的目的是什么,答案就是继承——这种属性通过继承是无法被覆盖的。比如: 

class C(B):
  def __init__(self):
    super().__init__()
    self.__private = 1 # Does not override B.__private
    # Does not override B.__private_method()
  def __private_method(self):
    pass

 这里,私有名称 __private 和 __private_method 被重命名为 _C__private 和_C__private_method ,这个跟父类 B 中的名称是完全不同的。 

posted on 2018-01-13 10:28  李晓否  阅读(126)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3