Python class 没有价值

Python class does not have value

我是一名 Javascript 工程师,正在转任 JS/Python 职位。编写一些简单的 leetcode 以快速 Python 练习。

我想在这里创建一个 LinkedList,也许我是从 JS 的角度来看的?

错误: AttributeError: 类型对象 'LinkedListNode' 没有属性 'value'

utils.py

# LinkedList Methods

def createLinkedList(arr):
    head = createLinkedListNode(None, arr.pop(0))

    def populateList(arr, prevNode):
        if arr:
            node = createLinkedListNode(None, arr.pop(0))
            prevNode.next = node
            if arr:
                populateList(arr, node)

    populateList(arr, head)

    return head

def createLinkedListNode(next, value):
    class LinkedListNode:
        def __init__(self):
            self.next = next
            self.value = value

    return LinkedListNode

deleteNode.py

from python.utils import createLinkedList, linkedListToArray

useCase1 = [4, 5, 1, 9]

linkedList = createLinkedList(useCase1)

^ linkedList.value 不存在?

createLinkedListNode() returns LinkedListNode class 本身,而不是 class 的 实例

为什么要在其他函数中定义 classes 和函数?这是一种奇怪的做事方式。

对python的一些误解classes:

  1. class LinkedListNode 不应在函数中定义。
  2. Return LinkedListNode 实际上是 returning class 本身,而不是 Instance。要 return 实例,您必须 调用 class。 return LinkedListNode()
  3. 使用 next 作为实例变量并不理想。 next是python中的一个迭代函数,所以当你设置self.next = next时,实际上是将函数赋值给self.next
  4. 如果你想设置一个变量,比如self.next_value = next_value,你应该把next_value作为__init__函数的参数,比如def __init__(self, next_value)

下面是链表的简单演示:

class LinkedList:
    def __init__(self, value):
        self.value = value
        self.next_value = None

    def __iter__(self):
        yield self.value
        if self.next_value is not None:
            yield from self.next_value
        # else raise StopIteration

    def __getitem__(self, index):
        if index == 0:
            return self.value
        else:
            return self.next_value[index-1]
            # recursively get the next value

    def __str__(self):
        return str(self.value) + ' -> ' + str(self.next_value)

    def __len__(self):
        if self.next_value is None:
            return 1
        else:
            return 1 + len(self.next_value)
            # recursively get the length

    def append(self, value):
        if self.next_value is None:
            self.next_value = LinkedList(value, self)
        else:
            self.next_value.append(value)

a = LinkedList(2)
a.append(1)
a.append(3)

for num in a:
    print(num, end=", ")

print()

print(a[1])
print(a)
print(len(a))

输出:

2, 1, 3, 
1
2 -> 1 -> 3 -> None
3