购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.4 谁可以访问我的数据

大多数面向对象编程语言都有访问权限的概念,这与抽象有关。一些对象的属性和方法可以被标记为私有,意味着只有当前对象可以访问它们。另外一些被标记为受保护的,意味着只有该类及其子类可以访问它们。剩下的就是公开的,意味着任何对象都可以访问它们。

Python不是这样做的。Python不相信强制性的规矩,这些规矩将来可能会成为障碍。相反,它提供的是非强制性的指南和最佳实践。严格来说,类的所有方法和属性都是对外公开的。如果我们想要说明某个方法不应该公开使用,可以在它的文档字符串中表明这个方法只在内部使用(最好也解释一下相对的公开方法)。

我们经常这样提醒彼此:我们都是成年人。既然我们都可以看到源代码,把某些变量声明为私有就没有太大的意义。

按照惯例,我们通常在内部属性或方法前加上下画线字符_。Python程序员看到前面有下画线的函数或变量,会把其理解成:这一个内部变量,使用它之前一定要三思!但是如果他们一定要使用内部变量,Python解释器完全不会阻止他们。再说了,如果他们真的需要这样做,为什么要阻止他们呢?我们不知道我们的类将来会被用作什么,并且可能会在未来的版本中被删除。但下画线是一个非常明确的警告标志,应该尽量避免使用它。

还有另一种方式可以更强势地表明外部对象不能访问某个属性或方法:用双下画线__作为前缀。这会导致Python解释器对相关名称进行 命名改装 name mangling )。实际上,命名改装意味着如果真的需要,外面的对象仍然可以调用这一方法,只不过需要做一些额外的工作。这样做可以强烈地对外声明这个属性或方法的 私有性

当我们用双下画线时,属性将被加上_<类名>的前缀。当方法在类内部访问变量时,可以直接使用原本的名称,Python解释器会确保其能够被正确访问。当外部的类要访问时,它们必须自己进行命名改装。所以说,命名改装并不能保证私有性,它只是强烈建议保持私有。这种写法很少使用,并且在使用时经常会造成混淆。

不要自己创建以新的双下画线开头的名称,这只会带来麻烦。你可以认为这是为Python内部定义的特殊名称而保留的用法。

重要的是将封装作为一种设计原则,确保类的方法封装属性的状态变化。属性(或方法)是否是私有的并不会改变源自封装思想的良好设计。

封装原则适用于单个类及具有多个类的模块。它也适用于包含多个模块的包。作为面向对象Python的设计者,我们重新隔离了职责并清楚地封装了特性。

当然,我们正在使用Python来解决问题。事实证明,有一个巨大的标准库可以帮助我们创建有用的软件。庞大的标准库是我们将Python描述为“自带电池”语言的原因。开箱即用,你几乎拥有所需的一切,无须跑到商店购买电池。

除了标准库,还有更多的第三方包。在下一节中,我们将看看如何用第三方包扩展我们的Python开发环境。 gpjy2pnstsZyDmBLGdwxJhwfsWfoSPILP3QywqDSme8qNS5YQQSz5wRKQqRNMuyo

点击中间区域
呼出菜单
上一章
目录
下一章
×