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的功能。但是,为了解决最初的问题,您遇到的问题是字符串是不可变的。当您编写时,您正在更改'sobj_B.graph[0][1].name = 'jill'实例中保存的引用,而不是 in 中的引用。考虑以下: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. 也就是说,您的 classdefs 应该读取class a(object):等。这对于您的类是new-style是必要的,这是非常可取的。旧式类(不继承自object)只是为了向后兼容。在 Python 3 中,这不再是必需的,因为所有类都是新样式的。

于 2012-09-24T10:30:58.380 回答