zoukankan      html  css  js  c++  java
  • python3--命名空间字典

    命名空间字典

    我们学到了模块的命名空间实际上是以字典的形式实现的,并且可以由内置属性__dict__显示这一点。类和实例对象也是如此:属性点号运算其实内部就是字典的索引运算,而属性继承其实就是搜索连结的字典而已。实际上,实例和类对象就是Python中带有链接的字典而已。Python揭露这些字典,还有字典间的链接,以便于在高级角色中使用(例如,编码工具)。
    为了了解Python内部属性的工作方式,我们通过交互模式会话加入类,来跟踪命名空间字典的增长的方式。首先,我们定义二个超类和子类,而它们的方法会在实例中保存数据。

    当我们制作子类的实例时,该实例一开始会是空的命名空间字典,但是有链接会指向它的类,让继承搜索能顺着寻找。实际上,继承树可在特殊的属性中看到,:你可以进行查看。实例中有个Class属性连结到了它的类,而类有个bases属性,是一个元组,其中包含了通往更高的超类的链接。

    当类为self属性赋值时,会填入实例对象。也就是说,属性最后会位于实例的属性命名空间字典内,而不是类的。实例对象的命名空间保存了数据,会随实例的不同而不同,而self正是进入其命名空间的钩子。

    注意:类字典内的其他含有下划线变量名.Python会自动设置这些变量,它们中的大多数都不会在一般程序中使用到,但是有些工具会使用其中的一些变量(例如,__doc__控制讨论过的的文档字符串)。

    此外,Y是这些语句中创建的第二个实例,即使X的字典已由方法内的赋值语句做了填充,Y最后还是个空的命名空间字典。同样地,每个实例都有独立的命名空间字典,一开始是空的,可以记录和相同类的其他实例命名空间字典中的属性,完全不同的属性。因为属性实际上是Python的字典键,其实有两种方式可以读取并对其进行赋值:通过点号运算或者通过键索引运算。

    不过,这种等效关系只适用于实际中附加在实例上的属性。因为属性点号运算也会执行继承搜索,所以可以存取命名空间字典索引运算无法读取的属性。例如,继承的属性X.hello无法由X.__dict__['hello']读取.
    最后,下面是介绍过的内置函数dir用在类和实例对象上的情况。这个函数能用在任何带有属性的对象上:dir(objeot)类似于object.__dict__.keys()调用。不过,dir会排序其列表并引入一些系统属性。在Python2.2中,d!r也会自动收集继承的属性。

    亲自动手实验一下这些特殊的属性,来了解命名空间实际上怎么处理它们储存的属性的。即使你绝不会在程序内使用这些特殊属性,但是知道它们只是普通的字典,也有助于弄清楚命名空间的一般概念。

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    class Supper:
        def hello(self):
            self.data1 = "spam"
    
    class Sub(Supper):
        def hola(self):
            self.data2 = "eggs"
    
    x = Sub()
    print(x.__dict__)
    print(x.__class__)
    print(Sub.__bases__)
    print(Supper.__bases__)
    
    print("----------------------------------")
    y = Sub()
    x.hello()
    print(x.__dict__)
    
    x.hola()
    print(x.__dict__)
    
    print(Sub.__dict__)
    print(Supper.__dict__)
    
    print("----------------------------------")
    print(Sub.__dict__.keys(), Supper.__dict__.keys())
    print(y.__dict__)
    

    运行结果:

    {}
    <class '__main__.Sub'>
    (<class '__main__.Supper'>,)
    (<class 'object'>,)
    ----------------------------------
    {'data1': 'spam'}
    {'data1': 'spam', 'data2': 'eggs'}
    {'__module__': '__main__', 'hola': <function Sub.hola at 0x00000000022FFD08>, '__doc__': None}
    {'__module__': '__main__', 'hello': <function Supper.hello at 0x00000000022FFC80>, '__dict__': <attribute '__dict__' of 'Supper' objects>, '__weakref__': <attribute '__weakref__' of 'Supper' objects>, '__doc__': None}
    ----------------------------------
    dict_keys(['__module__', 'hola', '__doc__']) dict_keys(['__module__', 'hello', '__dict__', '__weakref__', '__doc__'])
    {}
    
  • 相关阅读:
    %2d
    将块中的文字设置成属性,即实现块中文字可拖动的功能
    获得块参照的插入点方法
    排序
    将几个实体对象变成一个块
    对克隆实体的类型转换
    对实体的克隆
    递归-顺序输出任意正整数各位
    递归-汉诺塔
    递归-最大公约数
  • 原文地址:https://www.cnblogs.com/chenlin163/p/7307542.html
Copyright © 2011-2022 走看看