python命名空间字典
最佳答案 问答题库1238位专家为你答疑解惑
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 搜索属性
类属性由全部实例共享,实例属性每个实例相互独立。
(2) 全部实例共享类属性。2实例属性(1)实例属性是指通过self.属性名=属性值,或实例名.属性名=属性值,获取的属性。
(2)每个实例的实例属性相互独立,互不干扰。
(3)实例无属性时,实例命名空间字典为空。
实例和类搜索属性都在属性命名空间字典查找。
搜索实例属性先从实例属性命名空间查找,再到类,超类查找,直到找到为止。
搜索类属性从类属性命名空间查找,再到超类查找,直到找到为止。
>>> 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()多。
示例
>>> 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__)方法开头的文档字符串
99%的人还看了
相似问题
- 详解Python安装requests库的实例代码
- 腾讯云4核8G服务器配置价格表,轻量和CVM标准型S5实例
- 类方法,静态方法和实例方法的区别及应用场景
- C#WPF用户控件及自定义控件实例
- 【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)
- C语言童年生活二三事(ZZULIOJ1091:童年生活二三事(多实例测试))
- QT基础入门【QSS】QT伪状态类型和实例
- spider 网页爬虫中的 AWS 实例数据获取问题及解决方案
- 适合小白的超详细yolov8环境配置+实例运行教程,从零开始教你如何使用yolov8训练自己的数据集(Windows+conda+pycharm)
- python:list和dict的基本操作实例
猜你感兴趣
版权申明
本文"python命名空间字典":http://eshow365.cn/6-40704-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: python-opencv 培训课程笔记(1)
- 下一篇: 编程刷题网站以及实用型网站推荐