关于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

posted @ 2018-11-17 13:49  flinca  阅读(683)  评论(0编辑  收藏  举报