我想使用super函数将字符串写入父对象的特定实例的列表中。到目前为止,这是我的代码:
#!/usr/bin/env python
# test.py
class Master(object):
def __init__(self):
pass
class Sub1(Master):
list = []
def __init__(self):
pass
class Sub2(Sub1):
def __init__(self, name):
super(Sub2, self).list.append(name)
m = Master()
m.foo = Sub1()
m.foo.bar = Sub2('something')
m.bla = Sub1()
m.bla.blub = Sub2('else')
print(m.foo.list)
在这种情况下,输出当然是
['something', 'else']
但我希望它只是'something'
。
我怎样才能做到这一点?
我试过了:
class Sub1(Master):
def __init__(self):
self.list = []
哪个收益率:
AttributeError: 'super' object has no attribute 'list'
有一个简单的解决方案吗?
答案 0 :(得分:0)
如您所知,如果您在lst
中将Sub1
定义为类属性,则会在所有实例之间共享,这不是您想要的。因此,您必须在lst
中将Sub1
定义为实例属性,但必须由Sub1
的实例管理,而不是Sub2
的实例。这是一个修改后的代码,提供您所期望的:
class Master(object):
def __init__(self):
super().__init__()
class Sub1(Master):
def __init__(self):
super().__init__()
self.lst = []
def add(self, item):
self.lst.append(item.name)
class Sub2(Sub1):
def __init__(self, name):
super().__init__()
self.name = name
m = Master()
m.foo = Sub1()
m.foo.add(Sub2('something'))
m.bla = Sub1()
m.bla.add(Sub2('else'))
print(m.foo.lst)
print(m.bla.lst)
这是输出:
['something'] <-- m.foo.lst
['else'] <-- m.bla.lst
Rem1:使用super()
时,整个类层次结构必须是协作的(即在构造函数中使用super()
)。
Rem2:在Python3中,super()
相当于super(classname, self)
Rem3:不要使用list
作为变量名称(它是内置类型)
Rem4:我的代码只存储列表中的name
属性来模仿你给出的示例,但我想在现实生活中你更愿意将Sub2
的实例存储在该列表中。为此,只需删除.name
功能中的add
。
编辑:想一想我的答案,我找到了另一种可能更接近你最初尝试的解决方案。让我知道哪一个最适合您的实际问题......
class Master(object):
def __init__(self):
super().__init__()
class Sub1(Master):
def __init__(self):
super().__init__()
self.lst = []
class Sub2(Sub1):
def __init__(self, parent, name):
super().__init__()
parent.lst.append(name)
m = Master()
m.foo = Sub1()
m.foo.bar = Sub2(m.foo, 'something')
m.bla = Sub1()
m.bla.blub = Sub2(m.bla, 'else')
print(m.foo.lst)
print(m.bla.lst)
答案 1 :(得分:-1)
您的实际问题似乎与初始化list
的方式有关。
您需要在__init__()
中分配它,而不是在类体内,以避免在类的所有实例之间共享它(请参阅Static class variables in Python)。
class Sub1(Master):
def __init__(self):
self.list = []