在类中追加列表(python)

时间:2011-05-28 12:59:41

标签: python

我遇到了python中的继承问题,我知道如何避免,但不完全理解。在制作菜单时出现问题,但我已经将代码简化为真正的问题。 代码:

class menu:
    buttonlist=[]

>>> class av(menu):
    def __init__(self, num):
        self.buttonlist.append(num)
        print self.buttonlist

>>> AV=av(12)
[12]
>>> class main(menu):
    def __init__(self, num):
        self.buttonlist.append(num)
        print self.buttonlist

>>> Main=main(14)
[12, 14]
>>> AV.buttonlist
[12, 14]

我期望通过'Main = main(14)'获得[14],并使用'AV.buttonlist'获得[12],但似乎append在所有类和对象中附加了列表:S 任何人都可以向我解释为什么会这样吗?

提前感谢!

4 个答案:

答案 0 :(得分:10)

因为buttonlist是类变量,而不是实例变量。如果希望它在实例的本地,则需要在构造函数中指定它。

class menu:
    def __init__(self):
        self.buttonlist = []

然后,当然,记得在派生类中调用基础构造函数。

答案 1 :(得分:2)

@Cat打败了我,但这里有一些工作代码

class Menu(object):
    def __init__(self):
        self.buttonlist = []

class AV(Menu):
    def __init__(self, num):
        Menu.__init__(self)
        self.buttonlist.append(num)
        print self.buttonlist

class Main(Menu):
    def __init__(self, num):
        Menu.__init__(self)
        self.buttonlist.append(num)
        print self.buttonlist

>>> av = AV(12)
>>> main = Main(14)

请注意,惯例是使用CamelCase命名python类,因此av类为AVmenuMenu。但这绝不是必需的。

答案 2 :(得分:0)

最简单的解释是,按钮列表是一个可变的列表,并且始终会产生该结果。 Cat Plus Plus解释是一个很好的方法。使用class属性而不是instance属性也会导致同样的问题。

#Main and AV.buttonlist are actually different, 
print Main
print AV
#you should get something similar to this pointing to different locations
<__main__.main object at 0x02B753F>
<__main__.av object at 0x02B6B910>

#if you are using string, it's different because string is immutable
class menu:
    buttonlist=""

class av(menu):
    def __init__(self, num):
        self.buttonlist = num


class main(menu):
    def __init__(self, num):
        self.buttonlist = num

a=av("food")
b=main("menu")

print(menu.buttonlist)
print(a.buttonlist)
print(b.buttonlist)

##works for strings. because they are immutable.
"""in your case lists are mutable and they will generate that"""  

答案 3 :(得分:0)

class av:
    def __init__(self, num):
        self.num = num

lst = []
lst.append(av(14))
lst.append(av(12))
print(str(lst[0]) + str(lst[1]))