• python命名空间字典


    1 python命名空间字典

    python命名空间是属性与对象的一一映射关系。

    任何一个属性通过命名空间都能找到唯一一个与之对应的对象。

    详细点击《python命名空间基础知识》。

    python的命名空间由字典实现,属性为键,对象为值。通过属性找到对象。

    1.1 dict

    __dict__为类和实例的属性字典—命名空间字典,通过字典找到属性指向的对象。

    实例无本身属性则为空字典。

    >>> class MySuper:
        s='梯阅线条'
        def m1(self):
            self.data1='MySuper'
    >>> class MyClassA(MySuper):
        def __init__(self):
            self.data2='MyClassA'
    
    # 类名.__dict__ 查看类的属性字典,
    # 前后带双下划线的为内置属性 , 其他为自定义属性        
    >>> MySuper.__dict__.keys()
    dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__'])
    >>> msp=MySuper()
    # 实例名.__dict__ 查看实例的属性字典,
    # 实例无本身属性则为空。
    >>> msp.__dict__.keys()
    dict_keys([])
    # 调用m1()通过self.属性=值,进行属性赋值
    >>> msp.m1()
    # 实例名.__dict__ 只返回实例赋值的属性,不返回类的属性
    >>> msp.__dict__.keys()
    dict_keys(['data1'])
    # 类名.__dict__ 只返回类属性,不返回实例属性
    >>> MySuper.__dict__.keys()
    dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__'])
    >>> msp2=MySuper()
    # 每个实例有独立的属性字典
    >>> msp2.__dict__.keys()
    dict_keys([])
    # 创建实例时自动执行__init__()给实例属性赋值
    >>> mca=MyClassA()
    >>> mca.__dict__.keys()
    dict_keys(['data2'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    1.2 class

    __class__获取实例所属类,再用获取的类创建实例。

    >>> class MyClass:pass
    >>> c1=MyClass()
    >>> c1
    <__main__.MyClass object at 0x03D19C50>
    # __class__ 返回实例所属类
    >>> c1.__class__
    <class '__main__.MyClass'>
    # 用返回的类创建实例对象
    >>> c2=c1.__class__()
    >>> c2
    <__main__.MyClass object at 0x03D19CF0>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    1.3 class.name

    class.__name__获取实例所属类的类名。

    >>> class MyClass:pass
    >>> c1=MyClass()
    >>> c1=MyClass()
    # __name__ 返回实例所属类的名字
    >>> c1.__class__.__name__
    'MyClass'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.4 bases

    获取类的直接超类组成的元组。

    >>> class MyClass:pass
    >>> class MyClassA(MyClass):pass
    >>> class MyClassB():pass
    >>> class MyClassC(MyClassA,MyClassB):pass
    # __bases__ 返回直接超类组成的元组
    >>> MyClassC.__bases__
    (<class '__main__.MyClassB'>, <class '__main__.MyClassA'>)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    1.5 搜索属性

    类属性由全部实例共享,实例属性每个实例相互独立。

    NO属性描述
    1类属性(1) 类属性是指类顶层赋值生成的属性。
    (2) 全部实例共享类属性。
    2实例属性(1)实例属性是指通过self.属性名=属性值,或实例名.属性名=属性值,获取的属性。
    (2)每个实例的实例属性相互独立,互不干扰。
    (3)实例无属性时,实例命名空间字典为空。

    实例和类搜索属性都在属性命名空间字典查找。

    搜索实例属性先从实例属性命名空间查找,再到类,超类查找,直到找到为止。

    搜索类属性从类属性命名空间查找,再到超类查找,直到找到为止。

    步骤描述
    1通过“实例名.dict”获取实例属性。
    2若无,则通过“实例名.class”获取实例所属类。
    3通过“类名.dict”获取类属性。
    4若无,则通过“类名.base”获取实例所属类的直接超类。
    5超类重复3到4步骤,获取类属性。
    >>> class MySuper:
        s='梯阅线条'
        def m1(self):
            self.data1='MySuper'
    
    >>> class MyClassA(MySuper):
        def __init__(self):
            self.data2='MyClassA'
    
    >>> msp1=MySuper()
    >>> msp1.__dict__
    {}
    >>> msp1.__class__.__name__
    'MySuper'
    >>> msp1.m1()
    >>> msp1.__dict__
    {'data1': 'MySuper'}
    >>> mca1=MyClassA()
    >>> mca1.__dict__
    {'data2': 'MyClassA'}
    >>> mca1.__dict__
    {'data2': 'MyClassA'}
    >>> MySuper.__dict__.keys()
    dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__'])
    >>> mca1.m1()
    >>> mca1.__dict__
    {'data2': 'MyClassA', 'data1': 'MySuper'}
    # 搜索s,从 MySuper.__dict__ 类命名空间获取
    >>> mca1.s
    '梯阅线条'
    # 搜索 data1 和 data2 从 实例命名看空间获取
    >>> mca1.data1
    'MySuper'
    >>> mca1.data2
    'MyClassA'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    1.6 dir

    dir(类或实例),返回类或实例的属性,包括系统属性,比__dict__.keys()多。

    NO使用描述
    1类.dict.keys()返回类属性,不包括系统属性
    2实例.dict.keys()返回实例属性,不包括类属性
    3子类.dict.keys()返回子类属性,不包括超类属性
    4子类实例.dict.keys()返回子类实例属性,不包括类和超类属性
    5dir(类)返回类属性,包括系统属性
    6dir(实例)返回实例属性,包括类属性和系统属性
    7dir(子类)返回类属性,包括超类属性和系统属性
    8dir(子类实例)返回子类实例属性,包括类、超类、系统属性

    示例

    >>> class MySuper:
        s='梯阅线条'
        def m1(self):
            self.data1='MySuper'
    
    >>> class MyClassA(MySuper):
        def __init__(self):
            self.data2='MyClassA'
        
    >>> msp1=MySuper()
    # 类.__dict__.keys() 返回类属性
    >>> MySuper.__dict__.keys()
    dict_keys(['__module__', 's', 'm1', '__dict__', '__weakref__', '__doc__'])
    # dir(类) 比 类.__dict__.keys() 多 系统属性
    >>> dir(MySuper)
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm1', 's']
    # dir(实例) 返回类属性
    >>> dir(msp1)
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm1', 's']
    # 实例.__dict__.keys() 不返回类属性 , 返回实例属性 
    >>> msp1.__dict__.keys()
    dict_keys([])
    
    # dir(类) 返回 超类的属性 
    >>> dir(MyClassA)
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'm1', 's']
    # 类.__dict__.keys() 不返回超类属性
    >>> MyClassA.__dict__.keys()
    dict_keys(['__module__', '__init__', '__doc__'])
    # dir(实例) 返回 超类的属性 
    >>> dir(mca1)
    ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'data2', 'm1', 's']
    # 实例.__dict__.keys() 不返回超类属性
    >>> mca1.__dict__.keys()
    dict_keys(['data2'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    1.7 继承层次例子

    通过__class__ 找到实例所属的类,通过 bases 找到超类,从而找到实例和类的继承层次。

    def classtree(cls,indent):
        print('| '* indent + '|-' + cls.__name__)
        # cls.__bases__
        for supercls in cls.__bases__:
            classtree(supercls,indent+1)
    
    def instancetree(inst):
        print('Tree of {}'.format(inst))
        # inst.__class__ 实例所属类
        classtree(inst.__class__,0)
        
    def selftest():
        class A:pass
        class B(A):pass
        class C(A):pass
        class D(B,C):pass
        class E:pass
        class F(D,E):pass
        instancetree(B())
        instancetree(F())
        
    if __name__ == '__main__':
        selftest()
        
    ''' 运行结果    
    E:\documents\F盘>python classtree.py
    Tree of <__main__.selftest..B object at 0x01978A30>
    |-B
    | |-A
    | | |-object
    Tree of <__main__.selftest..F object at 0x01978A30>
    |-F
    | |-D
    | | |-B
    | | | |-A
    | | | | |-object
    | | |-C
    | | | |-A
    | | | | |-object
    | |-E
    | | |-object
    '''
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    1.8 doc

    python文档字符串__doc__,值为模块文件开头、函数开头、类开头、方法开头的注释,python会自动封装这些注释,并且保存在__doc__。这些注释写在三引号内。

    1.8.1 自定义文档字符串

    文档字符串可以通过不同位置路径对象的__doc__获取。

    不同路径对象属性名(函数名、类名、方法名)可以通过dir(模块)获取。

    模块:模块名.doc

    函数:模块名.函数名.doc

    类:模块名.类名.doc

    方法名:模块名.类名.方法名.doc

    示例

    '''
    模块文件名:docstr.py
    模块开头的文档字符串
    '''
    S='梯阅线条'
    def hellof(name):
        '''
        函数开头的文档字符串
        '''
        print('hello ',name)
    
    class Student:
        '''
        类开头处的文档字符串
        '''
        def study(self):
            '''
            方法开头的文档字符串
            '''
            pass
        
    # 查看不同对象的__doc__文档字符串
    >>> path=r'E:\documents\F盘'
    >>> import os
    >>> os.chdir(path)
    >>> import docstr
    >>> dir(docstr)
    ['L', 'S', 'Student', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'hellof']
    >>> print(docstr.__doc__)
    
    模块文件名:docstr.py
    模块开头的文档字符串
    >>> print(docstr.hellof.__doc__)
    
        函数开头的文档字符串
    >>> print(docstr.Student.__doc__)
    
        类开头处的文档字符串
    >>> print(docstr.Student.study.__doc__)
    
            方法开头的文档字符串
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    地塞米松-PLGA纳米粒|共载吉西他滨和辛伐他汀的PLGA聚合物纳米粒|艾地苯醌-PLGA纳米粒(齐岳)
    如何控制工业设计公司的设计效果?
    天润融通:AI助手助力Klarna实现多语言客户服务革新
    vue3 弹窗开发之三,完善版
    Unity复刻骑砍中的帝国象棋(一)
    bulkTransfer发送数据丢包
    [附源码]java毕业设计大学生心理咨询网站
    【Linux】调试工具gdb
    前端css粘性布局,顶部吸附效果(position: sticky)
    裸机 lwip,客户端断开连接后,无法重新连接server端
  • 原文地址:https://blog.csdn.net/sinat_34735632/article/details/134495663