如果您真的想要 Python 中的私有变量……那么您不需要私有变量,并且应该阅读 Peter DeGlopper 的答案。
如果你仍然非常非常想要 Python 中的私有变量……好吧,你不能拥有它们。但是你可以拥有“合作私有”的变量——除非他们去寻找,否则没人会找到这些变量,当你在解释器中自省时,它不会弄乱屏幕,等等,最重要的是,Python 程序员知道,按照惯例,他们不应该接触。您所要做的就是以下划线开头的名称。
但是,由于多种原因,您的代码根本没有创建成员变量。
第一,global
不声明或定义变量;它所做的只是告诉 Python,“当你稍后看到这个变量时,不要使用常规规则来判断它是本地的还是全局的,始终使用全局副本”。您仍然必须在某处为变量赋值;否则,你会得到一个NameError
.
接下来,您在class
定义中分配的变量是类成员——类似于 Java 的静态成员,但并不完全相同。每个类成员由该类的所有实例共享。这不是你想要的。每个Node
都应该有自己独立的val
and next
,而不是与所有其他Node
s 共享一个,对吗?
普通的实例成员变量总是通过点语法访问——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 的答案,正如我在一开始所说的,这可能是您想要的。:)