如何使用super()更新父级的特定实例中的值?

时间:2018-04-09 13:18:48

标签: python inheritance

我想使用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'

有一个简单的解决方案吗?

2 个答案:

答案 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 = []