我遇到了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 任何人都可以向我解释为什么会这样吗?
提前感谢!
答案 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
类为AV
,menu
为Menu
。但这绝不是必需的。
答案 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]))