我的对象显然没有属性 'cargo'

My object apparently has no attribute 'cargo'

我是python/programming新手,正在自学python。不幸的是我真的卡住了!我在 "How to Think Like a Computer Scientist" 的第 19 章。 这里的目标是使用链表编写优先队列 ADT 的实现。

我在第 22 行和第 32 行收到一个错误。我对这个错误的理解是我的一个或多个节点对象没有属性 "cargo"。我不明白这一点,因为我的所有节点对象在创建时都被分配了 "None" 或某个数字的货物。节点对象按照书上给出的写法

我应该提一下,第 31 行运行良好。我只有在添加 LINE 32 时遇到问题,它调用 LINE 22(这显然是问题所在)我得到一个错误。

任何见解都会有所帮助。非常感谢!!!

我在较小的范围内重现了这个问题:

class Node:
def __init__(self, cargo= None, next = None):
    self.cargo = cargo
    self.next = next


class Priority_Queue_For_Linked():
def __init__ (self):
    self.max = None
    self.nextmax = None
    self.min = None
    self.length = 0

def insert (self, cargo):
    node = Node(cargo)
    if self.length == 0:
        node = self.max = self.min
        self.length = 1
        return

    if node.cargo > self.max.cargo:     # <--LINE 22
        notmaxanymore = self.max
        notmaxanymore.next = node
        node = self.max
        self.nextmax = notmaxanymore
        self.length += 1
        return

testlist = Priority_Queue_For_Linked()
testlist.insert(12)
testlist.insert(22)                     # <--LINE 32

这里是错误:

=== RESTART: /Users/Desktop/Programming Career/Untitled6.py ===

Traceback (most recent call last):
File "/Users/Desktop/Programming Career/Untitled6.py", line 31, in <module>
testlist.insert(22)# <--line 32
  File "/Users/Desktop/Programming Career/Untitled6.py", line 21, in insert
if node.cargo > self.max.cargo:# <--line 22
AttributeError: 'NoneType' object has no attribute 'cargo'

我怀疑您是否需要更多上下文,但如果有帮助,这里是所有代码:

class Node:
def __init__(self, cargo= None, next = None):
    self.cargo = cargo
    self.next = next

def __str__(self):
    return str(self.cargo)

def print_backward (self):
    if self.next != None:
        tail = self.next
        tail.print_backward()
    print self.cargo,

def print_list(node):
    while node:
        print node,
        node = node.next
    print


class Priority_Queue_For_Linked():
def __init__ (self):
    self.max = None
    self.nextmax = None
    self.min = None
    self.length = 0

def is_empty (self):
    if self.length == 0:
        print "List is empty."

def insert (self, cargo):
    node = Node(cargo)
    if self.length == 0:
        node = self.max = self.min
        self.length = 1
        return

    if node.cargo > self.max.cargo:########40
        notmaxanymore = self.max
        notmaxanymore.next = node
        node = self.max
        self.nextmax = notmaxanymore
        self.length += 1
        return

    if node.cargo < self.min.cargo:
        notminanymore = self.min
        node.next = notminanymore
        node = self.min
        self.length += 1
        return

    else:
        comparisonnode = self.min.next
        comparisonprev = self.min
        for i in range (2, self.length):
            if node.cargo < comparisonnode.cargo:
                node.next = comparisonnode
                comparisonprev.next = node
                self.length += 1
                break
            comparisonnode = comparisonnode.next
            comparisonprev = comparisonprev.next

def remove (self):
    maxtoremove = self.max
    self.max = self.nextmax
    self.max.next = None
    length -=1 
    return maxtoremove.cargo

def print_list(self):
    tempnode = self.min
    print "[",
    while not tempnode == None:
        print tempnode,
        tempnode = tempnode.next
    print "]"



testlist = Priority_Queue_For_Linked()
testlist.insert(12)
testlist.insert(22)#######86

Priority_Queue_For_Linked class 的 max 属性在 __init__ 方法中定义为 None ,并且在 if 语句之前没有更改.

我假设您打算在某个时候将节点指定为该属性的值,但您没有这样做。

您的代码尝试执行 self.max.cargo。在您的 __init__ 中,您将 self.max 设置为 None,并且您永远不会在其他任何地方更改此值,因此 self.max 是 None。如果你想能够使用self.max,你需要在某个时候将它设置为一个真实的节点值。

当您插入第一个项目时,您的作业出现问题:

if self.length == 0:
    node = self.max = self.min
    self.length = 1
    return

这不会改变 self.maxself.min 的值,它们将保持 None,当然不会有 cargo。您还会丢失要添加的节点。我假设你想这样做:

self.max = self.min = node