类中方法定义顺序是否重要?LinkedList类的两个运行疑问
关于Python LinkedList类的两个疑问解答
问题1:为什么在LinkedList的__init__方法中调用append方法,即便append定义在__init__之后,代码运行也不报错?
Python处理类定义时,会先把类内所有方法(无论定义顺序)都加载到类的命名空间中。当你实例化对象执行__init__时,append方法已经是类的成员方法,完全可以正常调用。这和普通函数必须先定义再调用的逻辑不同,类的方法是在类整体加载完成后才可供实例调用,所以方法定义顺序不影响调用。
问题2:执行my_linked_list = Linkedlist(3, 2, 7, 9)时,输出顺序是test1、test2、test2、test2、test1,而非预期的test2×3+test1,原因是什么?
看代码逻辑就能明白:
当传入多个参数时,init__进入else分支,首先执行self.__init__(value[0])——也就是递归调用__init__方法,传入单个参数3。这个递归的__init__会执行len(value)==1的逻辑,最后打印test1,这就是第一个输出的test1。
递归返回后,回到外层的__init,循环调用append方法传入2、7、9,每个append执行时都会打印test2,所以这里输出三个test2。
最后外层的__init__执行完毕,打印最后一个test1。
整个流程的输出顺序就是:递归__init__的test1 → 三次append的test2 → 外层__init__的test1。
相关代码
class Node: def __init__(self, value): self.value = value self.next = None class Linkedlist: def __init__(self, *value): if len(value) == 1: new_node = Node(value[0]) self.head = new_node self.tail = new_node self.lenght = 1 else: self.__init__(value[0]) other_values = value[1::] for i in other_values: self.append(i) print('test1') def append(self, *value): for i in value: new_node = Node(i) if self.head == None: self.head = new_node self.tail = new_node else: self.tail.next = new_node self.tail = new_node self.lenght += 1 print('test2') return True
执行代码
my_linked_list = Linkedlist(3, 2, 7, 9)
内容的提问来源于stack exchange,提问作者G_G
相关产品推荐
相关产品推荐

