类内追加列表(python)

类内追加列表(python),python,Python,我在python中遇到了一个继承问题,我知道如何避免,但不完全理解。这个问题是在制作菜单时出现的,但我已经将代码简化为真正的问题。 代码: 我希望通过'Main=Main(14)'得到[14],通过'AV.buttonlist'得到[12],但实际上append似乎在所有类和对象中都追加了列表:S 有人能解释一下为什么会这样吗 提前谢谢 因为buttonlist是类变量,而不是实例变量。如果希望它位于实例的本地,则需要在构造函数中分配它 class menu: def __init__(

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

我希望通过'Main=Main(14)'得到[14],通过'AV.buttonlist'得到[12],但实际上append似乎在所有类和对象中都追加了列表:S 有人能解释一下为什么会这样吗


提前谢谢

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

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

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

@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
类将是
av
,而
menu
将是
menu
。但这并不是必需的。

按钮列表是一个类属性,也是可变的(列表)

由于buttonlist未在基类中的_u__; init中定义,因此它是一个类变量而不是实例变量,因此所有继承的所有更改都会影响它。这意味着它不属于从它继承的任何类,而是属于所有实例。第一个实例附加了12,第二个实例附加了14

#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>

#obviouly different objects but inheriting from the same class. Thus,the class variable changes, keeps appending
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)

##won't work for strings as they are immutable and can't be changed after delared in the base class 

 
#Main和AV.buttonlist实际上是不同的,
打印总管
印刷影音
#你应该得到类似的东西指向不同的位置
#显然是不同的对象,但继承自同一类。因此,类变量会更改,并不断追加
类菜单:
buttonlist=“”
av类(菜单):
定义初始化(self,num):
self.buttonlist=num
类主菜单:
定义初始化(self,num):
self.buttonlist=num
a=av(“食品”)
b=主(“菜单”)
打印(菜单.按钮列表)
打印(按钮列表)
打印(b.按钮列表)
##不适用于字符串,因为它们是不可变的,并且在基类中delared后无法更改

我建议您使用
super(AV,self)。\uuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,请为你的代码写一点解释。请不要只发布代码作为答案,而要包括代码的作用以及它如何解决问题的解释。带有解释的答案通常质量更高,更容易吸引选票。
#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>

#obviouly different objects but inheriting from the same class. Thus,the class variable changes, keeps appending
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)

##won't work for strings as they are immutable and can't be changed after delared in the base class 

 
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]))