关于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基础12(collectionsstructitertoolschardet等的使用)