码迷,mamicode.com
首页 > 编程语言 > 详细

关于Python3的namedtuple问题

时间:2018-11-17 16:18:06      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:子类   type   自己   对象   print   sdn   http   总结   log   

初次看到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问题

标签:子类   type   自己   对象   print   sdn   http   总结   log   

原文地址:https://www.cnblogs.com/flincasnote/p/9973703.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!