关于Python3的namedtuple问题

Posted flincasnote

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Python3的namedtuple问题相关的知识,希望对你有一定的参考价值。

初次看到namedtuple,就发现此类和普通的非内置类有点不同,正常的类使用时即是实例化了,但namedtuple并不是,而是先内部先创建了一个自定义的特殊类:

 1  1 from collections import defaultdict, namedtuple
 2  2 
 3  3 
 4  4 A = namedtuple(B, [name1, name2])
 5  5 d_dict = defaultdict(list)
 6  6 C = A(4, diamonds)
 7  7 
 8  8 print(type(A))
 9  9 print(A.__mro__)
10 10 print(isinstance(A, type))
11 11 print("-" * 10)
12 12 
13 13 
14 14 print(type(d_dict))
15 15 print(isinstance(d_dict, defaultdict))
16 16 print("-" * 10)
17 17 
18 18 
19 19 print(type(C))
20 20 print(isinstance(C, A))
21 
22 
23 Out :
24   <class type>
25   (<class __main__.B>, <class tuple>, <class object>)
26   True
27   ----------
28   <class collections.defaultdict>
29   True
30   ----------
31   <class __main__.B>
32   True

像一般的类型比如说上面的defaultdict,或者自己定义一个类:

class myClass:
    pass


cls_1 = myClass()
print(type(myClass))
print(myClass.__mro__)


Out:
    <class type>
    (<class __main__.myClass>, <class object>)

一般定义过后,直接使用 object_name = class_name()调用构造方法就实例化了,但namedtuple第一步即: 

A = namedtuple(B, [name1, name2])

其实并没有完整的实例化(创建一个真正的namedtuple对象), 而是创建了一个带属性的tuple的自定义子类, 访问名称为A,内部名称为__main__.B(也就是type的实例,直接继承自tuple),然后经过

C = A(4, diamonds)

才真正的实例化了(创建了__main__.B(访问名称为A)的实例化对象)。

这里还同时引起了另一个问题那就是type和object的关系,之后找到一个帖子总结的不错:

  https://blog.csdn.net/andybegin/article/details/80775773

以上是关于关于Python3的namedtuple问题的主要内容,如果未能解决你的问题,请参考以下文章

Python3的namedtuple

Python3基础12(collectionsstructitertoolschardet等的使用)

Python3之collections模块

Python namedtuple(命名元组)使用实例

如何升级到python3版本并且安装pip3及ipython3

了解 Python 3.7 中类、namedtuple 和 __slots__ 的大小