0

学习 Python 时,我在制作链表类时遇到了一些问题。这只是一个快速节点和脏节点类。在 java 中,我会关闭私有节点 next 和私有 int val,但我只知道 global 作为 python 表亲。这看起来怎么样?

#class Node class

class Node(object):
    global next
    global val
    def __init__(self):
        next
        val
    def setNext(self, aNext):
        self.next = aNext
    def getNext(self):
        return self.next
    def setVal(self, aVal):
        self.val = aVal
    def getVal(self):
        return self.val

然后我尝试在另一个类中使用一个节点

from Node import *
head = Node()

我如何得到未定义变量的错误。抱歉,python 刚遇到这个简单的问题。感谢帮助。

4

4 回答 4

7

我会这样实现:

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

而已。没有 getter 或 setter - Python 不使用它们。相反,如果您需要摆脱基本的属性引用逻辑,您可以重构为一个属性。

然后,您可以创建带有或不带有值或后继的节点:

tailnode = Node()
tailnode.val = 'foo'
midnode = Node(val='bar')
midnode.next = tailnode
headnode = Node(val='baz', next=midnode)
于 2013-09-25T21:45:20.443 回答
1

您不需要“global val”/“global next” .. 这甚至是一个错误。而是只写 val = None next = None

并在__init__()

意思是,你班上的第一行应该是这样的:

class Node(object):
    # You can choose whether to initialize the variables in the c'tor or using your setter methods
    def __init__(self, val=None, next=None):
        self.next = next
        self.val = val
于 2013-09-25T21:44:10.713 回答
1

如果您真的想要 Python 中的私有变量……那么您不需要私有变量,并且应该阅读 Peter DeGlopper 的答案。

如果你仍然非常非常想要 Python 中的私有变量……好吧,你不能拥有它们。但是你可以拥有“合作私有”的变量——除非他们去寻找,否则没人会找到这些变量,当你在解释器中自省时,它不会弄乱屏幕,等等,最重要的是,Python 程序员知道,按照惯例,他们不应该接触。您所要做的就是以下划线开头的名称。


但是,由于多种原因,您的代码根本没有创建成员变量。

第一,global不声明或定义变量;它所做的只是告诉 Python,“当你稍后看到这个变量时,不要使用常规规则来判断它是本地的还是全局的,始终使用全局副本”。您仍然必须在某处为变量赋值;否则,你会得到一个NameError.

接下来,您在class定义中分配的变量是成员——类似于 Java 的静态成员,但并不完全相同。每个类成员由该类的所有实例共享。这不是你想要的。每个Node都应该有自己独立的valand next,而不是与所有其他Nodes 共享一个,对吗?

普通的实例成员变量总是通过点语法访问——self.foo从类的方法内部,或者spam.foo从外部。

那么,你在哪里声明这些?你没有。Python 没有声明任何东西。您可以随时向对象添加新成员。创建一组标准实例成员的常用方法是在__init__方法中:

class Node(object):
    def __init__(self):
        self._next = None
        self._val = None
    def setNext(self, aNext):
        self._next = aNext
    def getNext(self):
        return self._next
    def setVal(self, aVal):
        self._val = aVal
    def getVal(self):
        return self._val

但实际上,您可以让设置者创建它们。这样,如果有人在没有先打电话的getNext情况下打电话setNext(我认为这是非法的),你就会发现错误。

class Node(object):
    def setNext(self, aNext):
        self._next = aNext
    def getNext(self):
        return self._next
    def setVal(self, aVal):
        self._val = aVal
    def getVal(self):
        return self._val

或者,强制用户在构造时使用有效值初始化对象:

    def __init__(self, next, val):
        self._next = next
        self._val = val

同样,没有充分的理由首先在 Python 中使用 setter 和 getter。

因此,您的类的最简单实现是:

class Node(object):
    pass

虽然最 Pythonic 是:

class Node(object):
    def __init__(self, next, val):
        self.next = next
        self.val = val

……您会注意到,这是 Peter DeGlopper 的答案,正如我在一开始所说的,这可能是您想要的。:)

于 2013-09-25T22:46:54.327 回答
0

Python 并不真正使用私有变量。

像这样的东西是最好的:

class Node(object):
    def __init__(self):
        self.val = None
        self.next = None

然后,您制作并设置节点,如下所示:

>>> node = Node()
>>> node.val = 5
>>> node2 = Node()
>>> node2 = 1
>>> node.next = node2
>>> node.next.val
1

如果要创建节点,请Node(5, Node(1))使用:

class Node(object):
    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next
于 2013-09-25T21:46:35.763 回答