开发者社区> 问答> 正文

在类中封装属性名

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

展开
收起
哦哦喔 2020-04-17 15:01:42 794 0
1 条回答
写回答
取消 提交回答
  • 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中的名称是完全不同的。
    
    2020-04-17 15:01:51
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
继承与功能组合 立即下载
建立联系方法之一 立即下载
低代码开发师(初级)实战教程 立即下载