新しいクラスインスタンスは以前のインスタンス値を継承します

Signal4

私は二重にリンクされたリストを実装する小さなツリークラスを書いています:

class node(object): 
def __init__(self, level=0, pieces=0, parent=None,
             root=None, childNo=None, avgN=2): 

    self.level       = level   # Current level in the tree. Zero = top.
    self.pieces      = pieces  # Number of children. Can be constant or Poisson chosen random.
    self.parent      = parent  # Parent of this node.
    self.child       = {}      # Children of this node. Using a dictionary means
                               # the root could have direct access\
                               # to all children.
    self.childrenID  = {}
    self.myID        = childNo # This node's index in the parents self.child list.

    if (root == None):         # If I'm the root, then hey, I'm the root!
        self.root   = self
    else:
        self.root   = root

    self.avgN          = avgN
    self.numOfChildren = 0
    self.pieces        = self.avgN



def print_all_data(self):
    print "Printing all data for node:",self.myID
    obj_attr = [a for a in dir(n) if not a.startswith('__') and not callable(getattr(n,a))]
    for ob in obj_attr:
        print ob, getattr(n,ob)
    return


# This function acutally adds a child node to this parent.
def add_child_node(self, childno):

    self.numOfChildren        += 1
    if (self.numOfChildren > self.pieces):
        print "Error: number of children exceeds the number of assigned pieces"
        print "       for node:", self.myID

    childno                             = self.compute_new_child_ID(self.level, self.numOfChildren)
    self.childrenID[self.numOfChildren] = childno
    self.child[childno]                 = self.get_new_node(childno)

    return

def get_new_node(self,childno):

    return node(level=self.level+1, parent=self,
                root=self.root, childNo=childno,
                avgN=self.avgN)

def compute_new_child_ID(self, level, childno):
    return (level+1)*100 + childno
def get_child_no_from_child_ID(self, level, childID):
    return childID - (level+1)*100

一部の機能は重複しているように見えますが、これらは将来使用するためのプレースホルダーであることに注意してください。

インスタンスを作成すると、次のようになります。

n = node()
n.print_all_data()

Printing all data for node: None
avgN 2
child {}
childrenID {}
level 0
myID None
numOfChildren 0
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>

ただし、子を追加すると、親のプロパティが子に組み込まれます。

n.add_child_node(0)
n.add_child_node(1)
n.print_all_data()

Printing all data for node: None
avgN 2
child {101: <__main__.node object at 0x7fb33dc46350>, 102: <__main__.node object at 0x7fb33dc460d0>}
childrenID {1: 101, 2: 102}
level 0
myID None
numOfChildren 2
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>

子データは次のとおりです。

n.child[101].print_all_data()

Printing all data for node: 101
avgN 2
child {101: <__main__.node object at 0x7fb33dc46350>, 102: <__main__.node object at 0x7fb33dc460d0>}
childrenID {1: 101, 2: 102}
level 0
myID None
numOfChildren 2
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>

また、新しいノードを作成すると、この古いインスタンスデータが継承されます。

n2 = node()
n2.print_all_data()

Printing all data for node: None
avgN 2
child {101: <__main__.node object at 0x7fb33dc46350>, 102: <__main__.node object at 0x7fb33dc460d0>}
childrenID {1: 101, 2: 102}
level 0
myID None
numOfChildren 2
parent None
pieces 2
root <__main__.node object at 0x7fb33dc0ae10>

これで、StackOverflow全体を検索しましたが、init(これらはインスタンス属性です)の使用に失敗したり、関数定義で不変の辞書不適切に初期化したりしていませんここでさらに説明します)。SOには、自分の問題に一致する他の例が見つからなかったため、新しい質問が見つかりました。どんな援助も大歓迎です。

DavidFerenczyRogožan

インスタンスは正しいです、あなたは間違ったデータを印刷しているだけです。

このメソッドprint_all_dataは、現在のインスタンスの属性を出力する代わりに、変数によって参照されるインスタンスのn属性を常に出力します(これは、より高いスコープから継承され、使用されているインスタンスに関係なく、常に「ルート」ノードを参照します)。 (self参照)。

メソッドではprint_all_data、次のようなものが必要です(現在のインスタンスは変数によって参照されますself):

obj_attr = [a for a in dir(self)
            if not a.startswith('__') and not callable(getattr(self, a))]

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Javaで属性を継承します。新しいインスタンス?

分類Dev

継承された静的メソッドを介して継承されたクラスの新しいインスタンスを作成する

分類Dev

クラスのインスタンスを新しいインスタンスに置き換えます

分類Dev

ObjectiveCで継承しないクラスのインスタンス

分類Dev

Typescriptはクラスに新しいインスタンスを作成します

分類Dev

PHPは、親クラスの既存のインスタンスに基づいて子クラスの新しいインスタンスを作成します

分類Dev

抽象クラスから継承し、プロパティに特定の値を持つクラスのインスタンスを取得します

分類Dev

新しいインスタンスのクラス参照を作成します。

分類Dev

サブクラスをインスタンス化し、特定のプロパティを継承しない方法はありますか?

分類Dev

Ruby-値を継承せずに子クラスのクラスインスタンス変数を自動的に初期化します

分類Dev

関数のクラスがNSObjectから継承しない場合は、ObjCから迅速なインスタンス関数を呼び出します

分類Dev

クラスの代わりにクラスインスタンスを使用したクラス継承

分類Dev

abstact基本クラスから継承されたクラスインスタンスの新しいクラスインスタンスの作成/クラスインスタンスのリセット

分類Dev

クラスをインスタンス化するときにトレイトから継承します

分類Dev

シングルトンパターンを使用したPHPでのクラス継承は、継承されたクラスのインスタンス変数が再初期化された場合にのみ機能します。しかし、なぜ?

分類Dev

別のクラスを継承するクラスは、そのクラスがクラス/インターフェイスを継承することを継承しますか?

分類Dev

既存のインスタンスの値を使用して、タイプの新しいインスタンスをクリーンに作成します

分類Dev

クラスをコピーしてインスタンス化し、継承を使用して別のクラスとして使用します

分類Dev

JUnitは@BeforeEachなしでクラスの新しいインスタンスを作成しますか?

分類Dev

Pythonでインスタンスタイプを継承に変更します

分類Dev

EntityManagerのfind()メソッドは、JPAクラスの新しいインスタンスを作成しますか?

分類Dev

新しいインスタンスを介してクラスへのアクセスを取得します

分類Dev

インスタンスへの参照とインスタンスは新しいIDを作成しますか

分類Dev

テンプレートクラスのインスタンス化は、クラスの継承とどのように連携しますか?

分類Dev

別のクラス/インターフェースからエンティティクラスを継承するのは正しい方法ですか?

分類Dev

2つのクラスを継承し、インターフェースから別々に実装します

分類Dev

少ないミックスインはクラスを継承しません

分類Dev

継承の概念を使用したインスタンス変数アクセス

分類Dev

cppyyはスマートポインタを含むクラスを継承します

Related 関連記事

  1. 1

    Javaで属性を継承します。新しいインスタンス?

  2. 2

    継承された静的メソッドを介して継承されたクラスの新しいインスタンスを作成する

  3. 3

    クラスのインスタンスを新しいインスタンスに置き換えます

  4. 4

    ObjectiveCで継承しないクラスのインスタンス

  5. 5

    Typescriptはクラスに新しいインスタンスを作成します

  6. 6

    PHPは、親クラスの既存のインスタンスに基づいて子クラスの新しいインスタンスを作成します

  7. 7

    抽象クラスから継承し、プロパティに特定の値を持つクラスのインスタンスを取得します

  8. 8

    新しいインスタンスのクラス参照を作成します。

  9. 9

    サブクラスをインスタンス化し、特定のプロパティを継承しない方法はありますか?

  10. 10

    Ruby-値を継承せずに子クラスのクラスインスタンス変数を自動的に初期化します

  11. 11

    関数のクラスがNSObjectから継承しない場合は、ObjCから迅速なインスタンス関数を呼び出します

  12. 12

    クラスの代わりにクラスインスタンスを使用したクラス継承

  13. 13

    abstact基本クラスから継承されたクラスインスタンスの新しいクラスインスタンスの作成/クラスインスタンスのリセット

  14. 14

    クラスをインスタンス化するときにトレイトから継承します

  15. 15

    シングルトンパターンを使用したPHPでのクラス継承は、継承されたクラスのインスタンス変数が再初期化された場合にのみ機能します。しかし、なぜ?

  16. 16

    別のクラスを継承するクラスは、そのクラスがクラス/インターフェイスを継承することを継承しますか?

  17. 17

    既存のインスタンスの値を使用して、タイプの新しいインスタンスをクリーンに作成します

  18. 18

    クラスをコピーしてインスタンス化し、継承を使用して別のクラスとして使用します

  19. 19

    JUnitは@BeforeEachなしでクラスの新しいインスタンスを作成しますか?

  20. 20

    Pythonでインスタンスタイプを継承に変更します

  21. 21

    EntityManagerのfind()メソッドは、JPAクラスの新しいインスタンスを作成しますか?

  22. 22

    新しいインスタンスを介してクラスへのアクセスを取得します

  23. 23

    インスタンスへの参照とインスタンスは新しいIDを作成しますか

  24. 24

    テンプレートクラスのインスタンス化は、クラスの継承とどのように連携しますか?

  25. 25

    別のクラス/インターフェースからエンティティクラスを継承するのは正しい方法ですか?

  26. 26

    2つのクラスを継承し、インターフェースから別々に実装します

  27. 27

    少ないミックスインはクラスを継承しません

  28. 28

    継承の概念を使用したインスタンス変数アクセス

  29. 29

    cppyyはスマートポインタを含むクラスを継承します

ホットタグ

アーカイブ