2

宣言されているのと同じクラスの型を持つ変数を作成したいと思います。

Class C:
    def __init__(self):
        self.v = C()

それは機能していません、これを機能させるためのいくつかのトリックはありますか?

4

5 に答える 5

3

Pythonは静的型付けを使用しないため、クラス内で同じ型のオブジェクトを参照するために特別なことをする必要はありません。

class Node:
    def __init__(self, left=None, right=None):
        self.left = left
        self.right = right

leaf1 = Node()
leaf2 = Node()
parent = Node(leaf1, leaf2)
于 2012-09-15T22:46:40.890 に答える
2

別の解決策は、必要なときに変数を作成するゲッターを使用することです。

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)をツリーノードに拡張するため、このソリューションは機能しません。

于 2012-09-15T22:49:54.057 に答える
1

そうすると、無限ループに陥ることはありません。

編集

class C:
    def __init__(self, member):
        self.v = member

if __name__ == "__main__":
    a = C(None)
    b = C(a)

このバージョンが機能するには、最初のインスタンスに偽のパラメーターが必要ですが、コメントで述べたように、なぜこれを実行したいかわかりません。

于 2012-09-15T22:41:54.380 に答える
1

あなたが実際に説明しているのは、何らかの形のリンクリストです。あなたはそのようにこれを行うことができます:

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()

したがって、vnoneに設定すると、次のようになります。

object_1 = C()
# -> object_1.v = None
object_2 = C()
# -> object_2.v = None

object_1.v = object_2
# -> object_1.v = object_2
于 2012-09-15T22:49:44.187 に答える