全面理解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() | 返回子类实例属性,不包括类和超类属性 |
5 | dir(类) | 返回类属性,包括系统属性 |
6 | dir(实例) | 返回实例属性,包括类属性和系统属性 |
7 | dir(子类) | 返回类属性,包括超类属性和系统属性 |
8 | dir(子类实例) | 返回子类实例属性,包括类、超类、系统属性 |
示例
>>> 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命名空间字典内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Pytorch之nn.Upsample()和nn.ConvTranspose2d()用法详解
nn.Upsample和nn.ConvTranspose2d是PyTorch中用于上采样的两种主要方法,nn.Upsample通过不同的插值方法(如nearest、bilinear)执行上采样,没有可学习的参数,适合快速简单的尺寸增加,而nn.ConvTranspose2d通过可学习的转置卷积核进行上采样2024-10-10Python3.5以上版本lxml导入etree报错的解决方案
这篇文章主要介绍了Python3.5以上版本lxml导入etree报错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-06-06Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
下面小编就为大家带来一篇Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-05-05
最新评论