Python で本当にプライベート変数が必要な場合は、プライベート変数は必要ありません。Peter DeGlopper の回答を読む必要があります。
それでも、本当に、本当に Python でプライベート変数が必要な場合は…まあ、それらを持つことはできません。しかし、「協調的にプライベートな」変数を持つことができます — 探しに行かなければ誰も見つけられず、インタープリターで物事を内省するときに画面が乱雑になることのない変数など、そして最も重要なのは、その Python プログラマー慣例により、触れてはならないことを知っています。名前をアンダースコアで始めるだけです。
ただし、いくつかの理由により、コードはメンバー変数をまったく作成していません。
まず、global
変数を宣言または定義しません。それが行うのは、Python に「この変数を後で見たときに、それがローカルかグローバルかを判断するために通常のルールを使用せず、常にグローバル コピーを使用する」ことです。変数のどこかに値を代入する必要があります。それ以外の場合は、NameError
.
次に、class
定義で割り当てる変数はクラスメンバーです。Java の静的メンバーに似ていますが、同一ではありません。各クラス メンバーは、クラスのすべてのインスタンスによって共有されます。それはあなたがここで望んでいることではありません。それぞれNode
が独自の個別のval
andを持っているはずでありnext
、1 つを他のすべての s と共有するのではありませんNode
よね?
通常のインスタンス メンバー変数は、クラスのメソッド内から、または外部から、常にドット構文を介してアクセスされます。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 でセッターとゲッターを使用する正当な理由はありません。
したがって、クラスの最も単純な実装は次のとおりです。
class Node(object):
pass
最も Pythonic は次のとおりです。
class Node(object):
def __init__(self, next, val):
self.next = next
self.val = val
…お気づきでしょうが、これは Peter DeGlopper の答えであり、冒頭で述べたように、おそらくあなたが望むものです。:)