包含奇怪对象数组的 Python 对象

标签 python class object

<分区>

Possible Duplicate:
Static class variables in Python
Python OOP and lists

只是想知道我是否可以在这方面得到一些帮助。

我正在使用 python,并且遇到了一个障碍,我似乎无法用我正在处理的小程序弄清楚。这是我的问题(使用一个非常简单且不相关的示例):我有一个类:

class dog:
    name = ''
    friends = []

我用它做了几个对象:

fido = dog()
rex = dog()

这就是我卡住的地方。我不知道为什么会这样,我还没弄明白。我假设我对某些事情的理解是有缺陷的,任何解释都会很好。所以这是我的问题,如果我将一个对象附加到另一个对象(看起来应该可以正常工作):

fido.friends.append(rex)

...事情搞砸了。正如您在这里看到的:

>>> fido.friends.append(rex)
>>> fido.friends
[<__main__.dog instance at 0x0241BAA8>]
>>> rex.friends
[<__main__.dog instance at 0x0241BAA8>]
>>> 

这对我来说毫无意义。不应该只有 fido.friends 里面有东西吗?即使我创建了一个新对象:

rover = dog()

它有一个狗实例,我们可以看到它是我们的“rex”对象。

>>> rex.name = "rex"
>>> fido.friends[0].name
'rex'
>>> rex.friends[0].name
'rex'
>>> rover.friends[0].name
'rex'
>>> 

这完全没有意义,我希望得到一些帮助。我四处搜寻了一段时间,试图找到一个解释,但没有找到。对不起,如果我错过了类似的问题。

最佳答案

如果每只狗都应该有自己的 friend 列表,则必须使用instance属性:

class Dog(object):

    family = 'Canidae' # use class attributes for things all instances share 

    def __init__(self, name):
        """ constructor, called when a new dog is instantiated """
        self.name = name
        self.friends = []

    def __repr__(self):
        return '<Dog %s, friends: %s>' % (self.name, self.friends)

fido = Dog('fido')
rex = Dog('rex')

fido.friends.append(rex)
print(fido) # <Dog fido, friends: [<Dog rex, friends: []>]>

你用的是class attributes (该值在实例之间共享)。更多相关信息:

关于包含奇怪对象数组的 Python 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14178203/

相关文章:

javascript - 向所有函数添加一行代码

javascript - 如何在 JavaScript 中删除数组中的特定元素

javascript - 测试是否存在嵌套的 JavaScript 对象键

python - 如何使用 lxml 获取斜体和非斜体文本

python - 将 counter.items() 字典合并为一个字典

python - 在 FT2Font : Can not load face

object - ColdFusion ORM : Table/View does not exist

python - 具有归一化行的 2D 直方图

java - 数组返回可以用于赋值,但不能用于循环

MySQL 的 c# 包装器类,在方法之间共享 "MySqlConnection()"对象是个好主意吗?