前提知识点?
本文以准备以“链表类”为例,一步步深入学习“类”。关于链表的概念定义略,详见上一篇文章的介绍: 链接地址点这里快速到达
一个最基础的节点类
就一个初始化方法 __init__(),定义一个节点类
三个属性: 其中,val和value是等价的,表示节点存储的数据; next 表示指针,指向下一节点。
class Node():
def __init__(self, value=None, Next=None):
self.val = self.value = value
self.next = Next
'''
# 测试:
>>> node = Node(1)
>>> node.next = Node(2)
>>> node.val
1
>>> node.value
1
>>> node.next.val
2
>>>
>>> node = Node(1, Node(2))
>>> node.val
1
>>> node.next.value
2
>>>
'''
进一步尝试其他操作:
>>> node = Node()
>>> help(Node)
Help on class Node in module __main__:
class Node(builtins.object)
| Node(value=None, Next=None)
|
| Methods defined here:
|
| __init__(self, value=None, Next=None)
| Initialize self. See help(type(self)) for accurate signature.
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)
>>> node
<__main__.Node object at 0x00375B68>
>>> node.__doc__
>>> node.__dict__
{'val': None, 'value': None, 'next': None}
>>> node = Node(1,Node(2))
>>> node.__dict__
{'val': 1, 'value': 1, 'next': <__main__.Node object at 0x00375BB0>}
类的方法定义、数据描述符定义等就一两项,说明文档也为空。但就这么简单的类,已经可以用它解决实际问题了,来举个简单的例子:
将两个有序链表(升序)合并为一个新的有序链表并返回。 List1: 1->2>4->8? List2: 1->3->3->5->5
把可以反复利用的代码,新写两个函数拓展到这个类里:除了主要功能合并方法外,另写一个便于检查是否正确的遍历方法。 ?
拓展一: 新增方法
>>> class Node():
def __init__(self, value=None, Next=None):
self.val = self.value = value
self.next = Next
def merge(self, node):
ret = cur = Node()
while self and node:
if self.val < node.val:
cur.next = self
self = self.next
else:
cur.next = node
node = node.next
cur = cur.next
cur.next = self or node
return ret.next
def travel(self):
ret,cur = [],self
while cur is not None:
ret.append(cur.val)
cur = cur.next
return ret
测试结果:
>>> NodeList1 = Node(1,Node(2,Node(4,Node(8)))) >>> NodeList2 = Node(1,Node(3,Node(3,Node(5,Node(5))))) >>> NodeList1.travel() [1, 2, 4, 8] >>> NodeList2.travel() [1, 3, 3, 5, 5] >>> NodeList = NodeList1.merge(NodeList2) >>> NodeList.travel() [1, 1, 2, 3, 3, 4, 5, 5, 8] >>>?
经测试,完全正确! ?
?拓展二:魔术方法
对比内置list列表类,看以下代码:
>>> l = list([1,2,3])
>>> len(l)
3
>>> str(l)
'[1, 2, 3]'
>>> l
[1, 2, 3]
>>> type(l)
<class 'list'>
>>> type(l) is list
True
>>>
>>> n = Node(1,Node(2,Node(3)))
>>> len(n)
Traceback (most recent call last):
File "<pyshell#82>", line 1, in <module>
len(n)
TypeError: object of type 'Node' has no len()
>>> str(n)
'<__main__.Node object at 0x0000000002CD28B0>'
>>> n
'<__main__.Node object at 0x0000000002CD28B0>'
>>> type(n)
<class '__main__.Node'>
>>> type(n) is Node
True
>>>
请出__len__, __str__, __repr__等等这些标准的类内置方法(命名两头均是双下划线),来模拟内置类的功能。同时去掉merge保留travel改名为values,travel结果返回文本。
|