把名称封装到类中——Python类中下划线的使用

有时我们想将“私有”数据封装到类的实例上,但是又需要考虑到Python缺乏对属性的访问控制问题,这时可以通过特定的命名规则来表达出对数据和方法的用途。

1、任何以单下划线(_)开头的名字应该总是被认为只属于内部实现

虽然python不会阻止任何人访问内部名称,但是一般来说是反对这样做的,对于下划线开头的名称应该视若无睹。

class A(object):

    def __init__(self):
        self._private = 0  # 内部实现,私有属性
        self.public = 1  # 公共属性
    #公有方法
    def publicMethod(self):
        print('this is a public method.')
     
    #私有方法
    def _privateMethod(self):
        print('this is a private method.')

a = A()
print('private:', a._private)  #可以访问,但不推荐这样做
print('public:', a.public)

a.publicMethod()
a._privateMethod()   #可以调用,不推荐这样做

#输出
private: 0
public: 1
this is a public method.
this is a private method.
2、以双下划线打头的名称会导致出现名称重整(name mangling)的行为。使得这样的属性/方法不会在继承时被覆盖。
class A(object):

    def __init__(self):
        self.__private = 0  #此时__private属性备重命名为_A__private

    def __privateMethod(self):
        print('this is a internal method.')


a = A()
print(a.__private)
#报错
AttributeError: 'A' object has no attribute '__private'

print(a._A__private)
#输出   0
a._A__privateMethod()
#输出 
this is a internal method.
3、最后,需要注意的是,在Python中,变量名类似__xxx__的(如__len__),也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,281评论 19 139
  • 前言 ||| 第二章 使用ArcPy编写脚本 Python支持大部分在其他语言中出现的编程结构。在本章内容中,我们...
    muyan阅读 90,513评论 10 55
  • python 中变量的命名规范 模块名: 小写字母,单词之间用_分割 ad_stats.py 包名: 和模块名一样...
    步_尘阅读 2,563评论 0 0
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,673评论 1 118
  • 松鼠被带上了宇航服,松鼠被装进了火箭,松鼠被送入了太空,它起飞的时候,所有人抬头看,他们说:“看,它在飞。”然后又...