13

可能重复: Python Python OOP 和列表
中的静态类变量

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

我正在使用 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()

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

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

这只是没有意义,我希望得到一些帮助。我搜索了一段时间试图找到一个解释,但没有。抱歉,如果我错过了类似的问题。

4

4 回答 4

7

如果每只狗都应该有自己的朋友列表,则必须使用实例属性:

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: []>]>

您使用的是类属性(值在实例之间共享)。更多关于这个:

于 2013-01-06T01:09:48.043 回答
3

在类内部声明的变量,不附加到实例,是python 中的静态变量。

于 2013-01-06T01:02:57.687 回答
1

为避免这种情况,请将变量声明放在__init__函数中,如下所示:

class Dog:
    def __init__(self):
        self.name = ''
        self.friends = []
于 2013-01-06T01:05:52.533 回答
1

实现您想要做的事情的正确方法是使用该__init__方法:

>>> class dog:
       def __init__(self):
           self.f = []


>>> a = dog()
>>> b = dog()
>>> a.f.append(b)
>>> a.f
[<__main__.dog instance at 0x02DA6F08>]
>>> c = dog()
>>> c.f
[]
于 2013-01-06T01:07:00.137 回答