1

私は自分のコードで間違った道を進んでいるだけだと思います。私はいくつかのpythonicの答えを得ることを望んでいました。

[object.name, object] のリストを生成できるようにしたいと考えています。その後、メソッドを使用して object.name のリストを検索し、オブジェクトを返します。ユーザーは object.name も変更できる必要があります。以下のコードはクラスを設定します。

class a():
    def __init__(self, name):
        self.name = name

class b():
    def __init__(self):
        self.graph = []
    def make_a(self, name):
        new_a = a(name)
        self.graph.append([new_a.name, new_a])

次に、ユーザーは次のように入力します。

obj_B = b()
obj_B.make_a('jack')
obj_B.graph
[['jack', <a instance at 0x02FB2260>]]

その後、ユーザーは次のことができるようになります。

obj_B.graph[0][1].name = 'jill'

次に、の出力は次のobj_B.graphようになります。

[['jill', <a instance at 0x02FB2260>]]

これを書いているときに、おそらく辞書を使用してから、新しい辞書キーを作成して古い辞書キーを削除するメソッドを作成する必要があることに気付きました。誰かがより良いアイデアを持っているなら、私はそれらを見て感謝します.

4

1 に答える 1

0

@David Robinsonが指摘したように、dictの機能を再実装しようとしているようです。ただし、元の質問に対処するには、文字列が不変であるという問題があります。を記述すると、のobj_B.graph[0][1].name = 'jill'インスタンスに保持されている参照が変更されますが、 の参照は変更されません。次の点を考慮してください。anameobj_B.graph

>>> a = 'hello'
>>> b = a  # b is now a reference to the same str object as a
>>> id(a)
4305179104
>>> id(b)
4305179104
>>> b is a
True
>>> a = 'goodbye'  # create a new str object in the heap, and change the reference belonging to a
>>> id(a)
4305179152  # not the same object as before!
>>> id(b)
4305179104  # b is the same
>>> b is a
False

これを、その場で変更される可変型と比較してください。

>>> a = [1,2,3]
>>> b = a
>>> a.append(4)  # we are not reassigning a, just modifying the list object it points to
>>> print a
[1, 2, 3, 4]
>>> print b
[1, 2, 3, 4]
>>> b is a
True

これは、参照が名前空間の変数であるか、リストのエントリであるかに関係なく適用されます。

元の質問に対する解決策はname、メソッドを作成し、次のように呼び出しでアクセスすることです。

class A(object):
    def __init__(self, name):
        self._name = name
    def set_name(self, name):
        self._name = name
    def get_name(self):
        return self._name

>>> l = []
>>> a = A('jack')
>>> l.append((a.get_name, a))
>>> l[0][1].set_name('jill')
>>> l[0][0]()
'jill'

または、クラスに__str__メソッドを指定し、それを使用して名前を返すこともできます。そうすれば、リスト内の単一のエントリのみが必要になります。

class A(object):
    def __init__(self, name):
        self.name = name
    def __str__(self):
        return self.name

>>> l = []
>>> l.append(A('jack'))
>>> str(l[0])
'jack'
>>> l[0].name = 'jill'
>>> str(l[0])
'jill'

PS、Python 2.x を使用している場合、作成するすべてのクラスは から継承する必要がありますobject。つまり、クラス定義は etc を読み取るclass a(object):必要があります。これは、クラスがnew-styleであるために必要であり、非常に望ましいです。古いスタイルのクラス ( から継承されないobject) は、単に後方互換性のために存在します。Python 3 では、すべてのクラスが新しいスタイルであるため、これは不要になりました。

于 2012-09-24T10:30:58.380 に答える