宣言されているのと同じクラスの型を持つ変数を作成したいと思います。
Class C:
def __init__(self):
self.v = C()
それは機能していません、これを機能させるためのいくつかのトリックはありますか?
Pythonは静的型付けを使用しないため、クラス内で同じ型のオブジェクトを参照するために特別なことをする必要はありません。
class Node:
def __init__(self, left=None, right=None):
self.left = left
self.right = right
leaf1 = Node()
leaf2 = Node()
parent = Node(leaf1, leaf2)
別の解決策は、必要なときに変数を作成するゲッターを使用することです。
Class C:
def __init__(self):
self.v = None
def get_v(self):
if self.v == None:
self.v = C()
return self.v
更新:これにより、Cのインスタンスのチェーンが必要に応じて新しいインスタンスで拡張され、Cの「無限の」チェーンが遅延して作成されます。ただし、元の質問は赤黒木を対象としていることが判明したため、アクセス時にnil-tree(leafs)をツリーノードに拡張するため、このソリューションは機能しません。
そうすると、無限ループに陥ることはありません。
編集:
class C:
def __init__(self, member):
self.v = member
if __name__ == "__main__":
a = C(None)
b = C(a)
このバージョンが機能するには、最初のインスタンスに偽のパラメーターが必要ですが、コメントで述べたように、なぜこれを実行したいかわかりません。
あなたが実際に説明しているのは、何らかの形のリンクリストです。あなたはそのようにこれを行うことができます:
class C:
def __init__(self):
self.v = None
object_1 = C()
object_2 = C()
object_1.v = object_2
あなたがしていることがうまくいかない理由は、あなたがするように言ったのC
は、1つのパブリックデータメンバーをCに設定することだけだからです。したがって、Cが行う方法を知っているのはそれだけなので、無限ループになります。
C's Procedure: When C is made, set a data member to a new C object
(その後、実行すると、次のようなものが得られます)
object = C()
# -> Object.v = C() <-c2
# --> c2.v = C() <-c3
# ---> c3.v = C() <- c4
# ....
# ....->cInfinity.v = c()
したがって、v
noneに設定すると、次のようになります。
object_1 = C()
# -> object_1.v = None
object_2 = C()
# -> object_2.v = None
object_1.v = object_2
# -> object_1.v = object_2