单链表节点类的初始化
1. class Node(): 2. 3. def __init__(self, value=None, Next=None): 4. self.val = value 5. self.next = Next
判断对象类型的两种方法
type() 或 instance(),用它们来测试:
>>> a,b,c = Node(),Node(1),Node(1,Node(2)) >>> type(a)==Node,type(b)==Node,type(c) is Node (True, True, True) >>> isinstance(a,Node),isinstance(b,Node),isinstance(c,Node) (True, True, True) >>> >>> num = 1 >>> type(num)==Node False >>> isinstance(num, Node) False >>> >>> nil = None >>> type(nil)==Node False >>> isinstance(nil, Node) False >>>
那么这样就够了吗?其实还存在问题:
>>> node1=Node(1,2) >>> node2=Node(1,Node(2)) >>> node1 Node(1->2) >>> node2 Node(1->2->None) >>> isinstance(node1,Node) True >>> isinstance(node2,Node) True >>> isinstance(node1.next,Node) False >>> isinstance(node2.next,Node) True
上面的测试中:node1的.next是整数2,也被认为是Node;但节点的本义 .next是要指向另一个节点的,所以要同时判断node和node.next都为Node才能认为它是节点:
>>> node1=Node(1,2) >>> node2=Node(1,Node(2)) >>> isinstance(node1,Node) and isinstance(node1.next,Node) False >>> isinstance(node2,Node) and isinstance(node2.next,Node) True >>>
改写成判断函数
>>> class Node(): def __init__(self, value=None, Next=None): self.val = value self.next = Next def isNode(node): return isinstance(node,Node) and isinstance(node.next,Node) >>> node1=Node(1,2); node2=Node(1,Node(2)) >>> node1.isNode() False >>> node2.isNode() True >>> >>> node3=Node() >>> node3.isNode() False >>> node4=Node(1) >>> node4.isNode() False >>>
可以判断出.next值不是节点的“伪节点”了,但对空节点和单个节点来说,它们的 .next 值是None,显然也要加以判断,还好 isinstance的第二参数可以接收各种类型值作为元素的元组:
>>> class Node(): def __init__(self, value=None, Next=None): self.val = value self.next = Next def isNode(node): return isinstance(node,Node) and isinstance(node.next,(Node,type(None))) >>> node1=Node() >>> node1.isNode() True >>> node2=Node(1) >>> node2.isNode() True >>>
但又有一个小问题,如果用这个函数来判断其它类型数据,会不会返错?想过没有其它类型可就不一定有.next属性:
>>> num = 1 >>> num.next Traceback (most recent call last): File "<pyshell#55>", line 1, in <module> num.next AttributeError: 'int' object has no attribute 'next' >>> nil = None >>> nil.next Traceback (most recent call last): File "<pyshell#57>", line 1, in <module> nil.next AttributeError: 'NoneType' object has no attribute 'next' >>> >>> Node.isNode(num) False >>> Node.isNode(nil) False >>>
思考:为什么没有.next属性的数据类型照常能够正确判断出是非节点呢?
原因很简单,因为逻辑“与”运算 and 有个特性: A and B ,如果A==True整个式子就是True,根本不会去判断B,不管它是True还是False,甚至它即使是错的也不会管。所以这个判断式 isinstance(node,Node) and isinstance(node.next,(Node,type(None))) 是可以正常工作的,也就是说这个 isNode() 是成功的。