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 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:passclass B(A):passclass C(A):passclass D(B,C):passclass E:passclass F(D,E):passinstancetree(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__)方法开头的文档字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/148211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAC实验(DAC 输出三角波实验)(DAC 输出正弦波实验)

DAC 输出三角波实验 本实验我们来学习使用如何让 DAC 输出三角波&#xff0c;DAC 初始化部分还是用 DAC 输出实验 的&#xff0c;所以做本实验的前提是先学习 DAC 输出实验。 使用 DAC 输出三角波&#xff0c;通过 KEY0/KEY1 两个按键&#xff0c;控制 DAC1 的通道 1 输出两种…

深度学习中的Linear层

在深度学习中&#xff0c;Linear层被广泛应用于各种神经网络中。它是一种线性变换&#xff0c;将输入向量映射到输出向量。本文将介绍Linear层的基本功能&#xff0c;以及在深度学习中的应用。 一、Linear层的功能 Linear层&#xff0c;也被称为全连接层&#xff0c;是深度学…

LinkWeChat V4.9.8 版本发布

LinkWeChat v4.9.8 已经发布&#xff0c;基于企业微信的 SCRM 系统 LinkWeChat 是国内首个基于企业微信的开源 SCRM&#xff0c;在集成了企微强大的开放能力的基础上&#xff0c;进一步升级拓展灵活高效的客户运营能力及多元化精准营销能力&#xff0c;让客户与企业之间建立强…

Nginx反向代理和负载均衡

1.反向代理 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;并将从服务器上得到的结果返回给internet上请求连接的客户端&#xff0c;此时代理服务器对外就表现为一…

记录:RK3568显示异常。

最近调一个RK3568的新板子&#xff0c;板子其它接口功能都调试ok。可唯独在适配显示时发现&#xff0c;HDMI和MIPI显示均出现异常。当系统启动要进入桌面时候内核就开始报错。 因为这套源码之前在其它的板子上适配过&#xff0c;所以第一反应就是硬件问题或者是那个电压没配置…

SQL注入1

对sql进行一个小结 还有其他的注入 其他注入:堆叠注入&#xff0c;宽字节注入&#xff0c;二次注入 首先是数值和字符 id1 and 11和id1 and 12 如果这两个语句返回的页面不一样就说明是数字型 id1 and 11#和id1 and 12# 如果这两个语句返回的页面不一样就说明是字符型 常…

【Promise12数据集】Promise12数据集介绍和预处理

【Segment Anything Model】做分割的专栏链接&#xff0c;欢迎来学习。 【博主微信】cvxiayixiao 本专栏为公开数据集的介绍和预处理&#xff0c;持续更新中。 要是只想把Promise12数据集的raw形式分割为png形式&#xff0c;快速导航&#xff0c;直接看2&#xff0c;4标题即可 …

【精选】项目管理工具——Maven详解

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程&#xff0c;管理jar包&#xff0c;编译代码&#xff0c;完成测试&#xff0c;项目打包等等。 Maven工具是基于POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;实现的。在Maven的管理下…

Spring Framework 6.1 正式 GA

Spring Framework 6.1在运行时方面针对 JDK 21 和 Jakarta EE 10 上提供了一级支持&#xff0c;同时保留了 JDK 17 和 Jakarta EE 9 基线。Spring 还通过精细的元数据推理跟踪 GraalVM for JDK 21 的演变&#xff0c;同时暂时保持与 GraalVM 22.3 的兼容性。 主要变化 支持 JD…

Unity在Windows选项下没有Auto Streaming

Unity在Windows选项下没有Auto Streaming Unity Auto Streaming插件按网上说的不太好使最终解决方案 Unity Auto Streaming插件 我用的版本是个人版免费版&#xff0c;版本号是&#xff1a;2021.2.5f1c1&#xff0c;我的里边Windows下看不到Auto Streaming选项,就像下边这张图…

Python-pptx教程之二操作已有PPT模板文件

文章目录 简单的案例找到要修改的元素修改幻灯片中的文本代码使用示例 修改幻灯片的图片代码使用示例 删除幻灯片代码使用示例 获取PPT中所有的文本内容获取PPT中所有的图片总结 在上一篇中我们已经学会了如何从零开始生成PPT文件&#xff0c;从零开始生成较为复杂的PPT是非常消…

Jmeter——循环控制器中实现Counter计数器的次数重置

近期在使用Jmeter编写个辅助测试的脚本&#xff0c;用到了多个Loop Controller和Counter。 当时想的思路就是三个可变的数量值&#xff0c;使用循环实现&#xff1b;但第三个可变值的数量次数&#xff0c;是基于第二次循环中得到的结果才能确认最终次数&#xff0c;每次的结果…

【测开求职】面试题:HR面相关的开放性问题

每一面可能都会穿插一些岗位理解的问题,有一些问题是真的挺不好回答的,最好还是提前准备一下,本篇文章总结了在面测试开发岗位中遇到的一些开放性问题👉 目录 💗如何理解测试开发💗为什么选择测试💗如何学习测试开发近期的职业规划前面面试的总结说一下你的优缺点最…

爱奇艺大数据离在线混部

混部作为一种提高资源利用率、降低成本的的方案&#xff0c;被业界普遍认可。爱奇艺在云原生化与降本增效的过程中&#xff0c;成功将大数据离线计算、音视频内容处理等工作负载与在线业务进行了混部&#xff0c;并且取得了阶段性收益。本文重点以大数据为例&#xff0c;介绍从…

mac 打不开 idea 或者 pycharm 的方法

1&#xff0c;进入 Jetbrains 安装目录 cd /Users/whoami/Library/Application\ Support/JetBrains 2, 删除旧版本的IDE&#xff0c;比如pycharm&#xff0c;之前有二个旧版本的目录&#xff0c;要装新的就把旧的全删除了&#xff0c;避免vm.options影响新的版本&#xff0c;导…

Linux终端与交互式Bash

常用的Linux终端 GNOME Terminal&#xff1a;GNOME 桌面环境下的默认终端程序&#xff0c;支持多个选项卡和配置。Konsole&#xff1a;KDE 桌面环境下的默认终端程序&#xff0c;提供了丰富的功能和选项。Terminator&#xff1a;开源的终端程序&#xff0c;支持多个可调整大小…

HDFS、MapReduce原理--学习笔记

1.Hadoop框架 1.1框架与Hadoop架构简介 &#xff08;1&#xff09;广义解释 从广义上来说&#xff0c;随着大数据开发技术的快速发展与逐步成熟&#xff0c;在行业里&#xff0c;Hadoop可以泛指为&#xff1a;Hadoop生态圈。 也就是说&#xff0c;Hadoop指的是大数据生态圈整…

多线程(初阶)

文章目录 一、认识线程&#xff08;Thread&#xff09;1.1 概念1.1.1 什么是线程1.1.2 为什么要有线程1.1.3 进程和线程的区别&#xff08;重要&#xff09;1.1.4 Java的线程和操作系统线程的关系 1.2 第一个多线程 程序1.3 创建线程&#xff08;重要&#xff09;1.3.1 继承 Tr…

iframe渲染后端接口文件和实现下载功能

一&#xff1a;什么是iframe&#xff1f; 1、介绍 iframe 是HTML 中的一种标签&#xff0c;全称为 Inline Frame&#xff0c;即内联框架。它可以在网页中嵌入其他页面或文档&#xff0c;将其他页面的内容以框架的形式展示在当前页面中。iframe的使用方式是通过在HTML文档中插入…

Linux_安装docker

安装包管理工具yum-utils&#xff0c;并设置docker储存库&#xff08;如果已有&#xff0c;不用安装&#xff09; # 安装包管理工具 sudo yum install -y yum-utils # 安装docker储存库 sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/cen…