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:
- class
LinkedListNode
不应在函数中定义。
- Return
LinkedListNode
实际上是 returning class 本身,而不是 Instance。要 return 实例,您必须 调用 class。 return LinkedListNode()
- 使用 next 作为实例变量并不理想。 next是python中的一个迭代函数,所以当你设置
self.next = next
时,实际上是将函数赋值给self.next
- 如果你想设置一个变量,比如
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
我是一名 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:
- class
LinkedListNode
不应在函数中定义。 - Return
LinkedListNode
实际上是 returning class 本身,而不是 Instance。要 return 实例,您必须 调用 class。return LinkedListNode()
- 使用 next 作为实例变量并不理想。 next是python中的一个迭代函数,所以当你设置
self.next = next
时,实际上是将函数赋值给self.next
- 如果你想设置一个变量,比如
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