全面理解python命名空间字典

 更新时间:2023年12月29日 10:04:24   作者:梯阅线条  
本文主要介绍了全面理解python命名空间字典,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 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.3 class.name

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

>>> class MyClass:pass
>>> c1=MyClass()
>>> c1=MyClass()
# __name__ 返回实例所属类的名字
>>> c1.__class__.__name__
'MyClass'

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.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.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.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.<locals>.B object at 0x01978A30>
|-B
| |-A
| | |-object
Tree of <__main__.selftest.<locals>.F object at 0x01978A30>
|-F
| |-D
| | |-B
| | | |-A
| | | | |-object
| | |-C
| | | |-A
| | | | |-object
| |-E
| | |-object
'''

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__)

        方法开头的文档字符串

到此这篇关于全面理解python命名空间字典的文章就介绍到这了,更多相关python命名空间字典内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 在python中获取div的文本内容并和想定结果进行对比详解

    在python中获取div的文本内容并和想定结果进行对比详解

    今天小编就为大家分享一篇在python中获取div的文本内容并和想定结果进行对比详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 利用Python连接MySQL超详细实战教程

    利用Python连接MySQL超详细实战教程

    mysql是关系型数据库,支持大型的数据库,可以处理拥有上千万条记录的大型数据库,这篇文章主要介绍了利用Python连接MySQL的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-02-02
  • python3.7+selenium模拟淘宝登录功能的实现

    python3.7+selenium模拟淘宝登录功能的实现

    这篇文章主要介绍了python3.7+selenium模拟登录淘宝功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 超级好用的4个Python命令行可视化库

    超级好用的4个Python命令行可视化库

    通常大家都是在自己的电脑上跑程序,直接是可以可视化相应的结果.如果是在服务器上的话,使用终端,是不太方便查看结果. 今天,小F就给大家介绍4个可以在命令行中使用的Python库. 分别是Bashplotlib、tqdm、PrettyTable、Colorama,需要的朋友可以参考下
    2021-06-06
  • python学习手册中的python多态示例代码

    python学习手册中的python多态示例代码

    多态是面向对象语言的一个基本特性,多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式,下面使用一个示例学习他的使用方法
    2014-01-01
  • python实现批处理文件

    python实现批处理文件

    这篇文章主要为大家详细介绍了python实现批处理文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • python使用pyshark库捕获数据包的示例详解

    python使用pyshark库捕获数据包的示例详解

    PyShark是一个基于Python的网络数据包分析工具库,它允许用户捕获、解码和分析实时网络流量,特别是Wi-Fi和TCP/IP协议的数据,所以本文给大家介绍了python使用pyshark库捕获数据包的示例,需要的朋友可以参考下
    2024-08-08
  • ansible作为python模块库使用的方法实例

    ansible作为python模块库使用的方法实例

    ansible是一个python package,是个完全的unpack and play软件,对客户端唯一的要求是有ssh有python,并且装了python-simplejson包,部署上简单到发指。下面这篇文章就给大家主要介绍了ansible作为python模块库使用的方法实例,需要的朋友可以参考借鉴。
    2017-01-01
  • Pyinstaller打包Scrapy项目的实现步骤

    Pyinstaller打包Scrapy项目的实现步骤

    这篇文章主要介绍了Pyinstaller打包Scrapy项目的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Python获取类属性的定义顺序的实战指南

    Python获取类属性的定义顺序的实战指南

    掌握类属性定义顺序的获取技术,可以帮助开发者构建更​​健壮的系统架构​​,特别是在需要保持数据一致性和可预测性的应用中,本文将深入探讨Python中获取类属性定义顺序的各种方法,大家可以根据需要进行选择
    2025-11-11

最新评论