2016-05-24 1 views
0

あるオブジェクト属性が別のオブジェクトの属性をどのように参照できるかを調べようとしています。たとえば、名前が「A」、子が「B」、「C」のオブジェクトがあります。私はまた、名前 "B"と子供( "D"、 "E")を持つ子供Bを持っています。これで親属性を持たせたいと思っています。異なるオブジェクトの属性が互いにどのように参照できるか

class FamilyTree: 
    def __init__(self, name, children, parent): 
     self.name = name 
     self.child = child 

私は次に何にしたくない:

を自動的に親の属性を知るためにBとCのための方法は...とDとEのために、それは、以下を参照してくださいB.だ知っておくべきです私はBがその親の属性を知りたい
self.parent = parent 

はA.

+0

いいえ; 'parent'属性を明示的に設定する必要があります。 – chepner

+0

明示的は暗黙的よりも優れています。 – ppperry

答えて

0

親がどこかに明示的に設定する必要があります。あなたは子供にそれを設定したくない場合は、この操作を行うことができます。

class FamilyTree: 
    def __init__(self, name, children): 
     self.name = name 
     self.children = children 
     for child in children: 
      child.parent = self 
+0

申し訳ありませんが、私はこれに新しいですが、上記を実装しようとすると、私は得ました:AttributeError: 'str'オブジェクトに 'parent'属性がありません。何かアドバイス? – NoPayn

+0

このコードは、1) 'children'が文字列ではなくインスタンスの配列であり、2)それらのインスタンスがすでに宣言されている場合に有効です。例: 'son = FamilyTree( 'Son'、[]);父親= FamilyTree( 'お父さん'、[息子]) ' –

0

あなたはこれを行うことができますが、最初に、あなたは、インスタンスを追跡し、追加のストレージを作成し、第二に、あなたの必要があります子の名前は一意でなければなりません( 'Dad_1'と 'Dad_2'の両方に 'John'という名前の息子がいる場合、どのJohnがそれを知っていますか)。もちろん、息子のインスタンスを作成する前に親のインスタンスが存在する必要があります。

class FamilyTree(object): 
    instances = [] 

    def __init__(self, name, children=None): 
     self.name = name 
     self.child = children 
     for inst in FamilyTree.instances: # Dad finder 
      if inst.child: 
       if self.name in inst.child: 
        self.parent = inst.name 
     FamilyTree.instances.append(self) # Add instance to storage 

dad = FamilyTree('Dad', ['Son', 'Daughter']) 
son = FamilyTree('Son', ['Son_of_Son', 'Daughter_of_Son']) 
son.parent 

Out[297]: 'Dad' 

デコレータまたはメタカルスを使用する他のソリューションがあります。それが最も明白なものです。

関連する問題