登陆注册
71628900000023

第23章 命名空间与面向对象

在 Python 中有一个名词叫做 namespace 单词,这是一个非常重要的概念。

命名空间是一个用来管理所有识别符的抽象机制,这些识别符都要定义在一个特殊范围里,把每一个名字与其相关的值映射在一起。

在 Python 里,函数、类、模块名都是一等类对象,在命名空间里的一个识别符的相关值也许就是一个函数、一个类、或一个模块。

命名空间涉及范围管理,就是常说的 LEGB规则:

L:Local 本地范围,例如全局范围里定义的一个函数体范围。

E:Enclosing 封装范围,例如函数体里定义的一个内部函数体范围。

G:Global 全局范围,就是模块层范围。

B:Built-in 内置范围,就是 Python 天生自带的各个对象名存储的范围。

那么 Python 的面向对象管理就是根据这个命名空间规则进行管理的,这是一个重点。我们通过如下几方面来认识和理解这个概念:

第一,实例和类的命名空间:

实例命名空间负责管理一个独立对象的具体属性。例如一个类的每个实例都彼此不一样,这是一种维护平衡的管理思想,属性的所属也都只与一个实例相关联。即使一个类建立的多个实例有相同的属性,但每个实例的属性就是该实例所拥有,与其它实例无关。

那么除了实例命名空间外,就是类命名空间了。在一个类定义完的时候这个类命名空间就完成了存储工作。类命名空间是用来管理一个类在所有类的实例之间共享的那些成员对象,也就是说,那些不需要指明专属于任何一个实例的方法。

例如:

class A:

def __init__(self):

def this_is_class_A_namespace(self):

class B(A):

group ='Pythonic'

def __init__(self, name):

self.name = name

def this_is_class_B_namespace(self):

b = B('pydojo')

这里我们总共有3个命名空间:

1.类命名空间中存储了类 A 中的 dunder init 和 this_is_class_A_namespace

2.另一个类命名空间中存储了类 B 中的 goup 以及 dunder init 和 this_is_class_B_namespace

3.实例命名空间存储了类B的一个实例的 name 属性。

那么有人可能会问,类 B 如果建立多个实例的话,那么实例之间的命名空间是如何区分的呢?那就与 Python 的命名解决方案和动态调度机制有关了。

我们在写类和实例有关的命名空间时,会建立许多命名空间的入口。在这些入口中会用来获得面向对象编程中的对象名字。在 Python 中这种入口的句法就是一个句号的连写,例如上面的例子中,b.name 就是访问命名空间入口的 Python 句法。

这里我们要知道的是,Python 解释器寻找名字会遵循一个顺序,那就是:

1.先搜索实例命名空间,如果找到了就使用相关的值。

2.在实例命名空间中找不到名字的话,就搜索类命名空间,找到属于一个类的实例再进行名字搜索,如果找到了使用相关的值。

3.如果在继承机制中的类命名空间里找不到名字的话,会继续沿着继承的等级结构,搜索上一级类命名空间,通常就是父类,然后就是爸爸的爸爸,以此类推。

4.如果依然找不到名字的话,解释器会抛出一个 AttributeError 例外错误。

以上描述就是著名的 MRO 命名空间搜索路径机制。

如果子类中覆写了父类中的同名方法,那么在传统的面向对象理论中,Python 会使用名叫动态调度机制来确定名字的所属,在运行时,一个方法的调用都是根据对象的类型,所以就有了确定所属的依据。

这与其它一些编程语言不同,因为它们会使用静态调度机制,这会导致只能在编译代码时才能确定一个调用的依据是一个变量的类型声明。

同类推荐
  • 智灵幻境

    智灵幻境

    地球文明进入太空时代,人工智能进化成为机器智人,两大种族如何共存,太空之外又是什么?探究新文明诞生起源,展望人类发展潜力,冲破文化理念束缚,创世新人类和平新纪元。一个古武功法重现辉煌的时代,一个人机融合新人类的时代,一个人类突破自我的时代,一个中华文明引导的时代。一个穿梭在时空中的故事,一个充满想象力的故事,也是一个需要你去探寻的故事。少年方小文穿梭在盘古宇宙、帝鸿宇宙、女娲世界,为何他有如此神奇的能力,他究竟如何从一个古武少年成长为时空巨头。
  • 逆战之末日尸国

    逆战之末日尸国

    丧尸病毒爆发十三年之后,杜毅终于进入安全区,本以为可以摆脱担惊受怕的日子,却迎来了更危险的挑战……
  • 无限进化之末日帝皇

    无限进化之末日帝皇

    赤月悬空,末世降临。这是人类最黑暗最坏的时代,也是群雄并起的恢弘时代。二度重生的唐昊,不仅拥有前两世的经验,这一世更是拥有《至尊帝皇系统》。这一世,唐昊立誓要成为这末世中的真正强者,成为众多进化丧尸和进化变异兽的噩梦!??
  • 特种部队返二战战场

    特种部队返二战战场

    一名屌丝青年高中毕业后昏头昏脑的参军到了猛虎侦察连,经过历练被选人特种部队,在一次周中随所在的精诚特种大队穿越到二战中期,同新四军与日军展开轰轰烈烈的战斗在1945年又回到现代.
  • 快穿之佛且甜

    快穿之佛且甜

    芩景醒来,远处是被烟霞侵染了的天空,她眨了眨眼,睁开。不可否认的是:她真的被选中了!!!初次见到大佬,芩景:怎么办?怎么办?听了不太靠谱的系统的话后。芩景:她决定用友情感化他。 第n次见到大佬以后。 芩景:……我都没做什么,你为什么要对我动手动脚? 今天又是扶着腰的一天呢!(咬牙切齿)
热门推荐
  • 红妆乱:特工女状元

    红妆乱:特工女状元

    特工美少女异世重生,一袭男装行天下。调戏良家妇女,勾引绝世美男,一路桃花朵朵开。皇子只要她?君主只为她?将军说放手?庄主说毁了她?妈妈咪呀,她可以自己选择不?选不了?她跑还不行吗?
  • 帝王追爱:小仙快到怀里来

    帝王追爱:小仙快到怀里来

    ”你还忘不掉他么?”某男一脸忧桑的看着冷冰冰的某女,“你指的是谁?”某女瞟了一眼可怜兮兮的某男,“......”某男瀑布汗。“阿九,你被人嫌弃了呢。”某男一脸奸笑的看着某女,得到的是某女一个冷冰冰的眼刀和无感情的一个字:“滚。”“阿九,我会对你好,我会一直陪伴你。”某男深情的看着某女,某女鄙夷的看着他说:“你能和我一样活个五千年再说。”某男默默蹲墙角画圈圈“阿九,明年我们也要一起看雪!”直接被某女无视......谁要陪你看雪啊,这么冷的天......
  • 是你从古至今都是你

    是你从古至今都是你

    一个经常做的梦,梦里看不清的人,一个从未见过却如此熟悉的人,是你一直都是你,从古至今都是你。
  • 有你们的日子春风十里

    有你们的日子春风十里

    青涩的初恋能否白头偕老欢歌笑语的同伴能否永远陪伴......
  • 天文地理趣味百科(趣味智力测验百科)

    天文地理趣味百科(趣味智力测验百科)

    本套丛书最大的特点是,标题提问简单明了,正文讲述精炼扼要,一问一答,相得益彰,详略得当,通俗易懂。正文还有趣味小版块,是对主要内容的适当补充、引申、扩展、点评、启发和引导等,用以开拓思维和引导知识,具有很强的启迪性。本套丛书涉及到少年儿童必须知道的许多知识领域,具有很强的系统性、实用性和现代性,是一套小小的百科全书,非常适合少年儿童阅读和收藏。
  • 末世之战国风云

    末世之战国风云

    整个世界都乱了,世界变成了游戏,为了在这强敌环视的世界生存只能不断的强化自己。英雄难免也会孤掌难鸣啊!努力活下去吧,在这乱世之中!
  • 这座城多了个开心的人

    这座城多了个开心的人

    善恶终有报,好报若是迟到,多半是老天爷在准备大礼包…
  • 天行

    天行

    号称“北辰骑神”的天才玩家以自创的“牧马冲锋流”战术击败了国服第一弓手北冥雪,被誉为天纵战榜第一骑士的他,却受到小人排挤,最终离开了效力已久的银狐俱乐部。是沉沦,还是再次崛起?恰逢其时,月恒集团第四款游戏“天行”正式上线,虚拟世界再起风云!
  • 冥界首席执行官

    冥界首席执行官

    微信摇一摇,咦?升官了?还是冥界的官!小鬼:大王,慈禧和袁世凯又打起来了。---来人,拖出去化了!小鬼:大王,珍妃娘娘闹自尽呢。---莫事莫事,本王这就穿越过去,给她平反。小鬼:大王,貂蝉吵着要见吕布!---这件事嘛?那个小布啊,你愿意见她么?小鬼:大王,武则天吵着要重阳。---烦不烦啊,拍晕!左边是展昭,右边是吕布,手握月光宝盒,忙着穿越上下五千年-----PS:每晚八点左右更新
  • 爱的路上不止你和我

    爱的路上不止你和我

    喜欢,是淡淡的爱;爱,是浓浓的喜欢。当浓浓的喜欢遇上淡淡的爱,结果似乎显而易见。林宇浩,一个算是被爱伤过的人,在选择爱的道路上,就算没有悬念,也免不了各种纠结。乔依依,一个完全没有恋爱经验的人,在遇上自己喜欢的人时,真是无主见。在爱情的道路上,爱,会很爱,不爱,会很不爱。在爱情的道路上,谁先认真,谁就先输了。在爱情的道路上,不论对与错。