Как я могу использовать super () Python для обновления родительского значения? - PullRequest
3 голосов
/ 01 мая 2011

Я новичок в наследовании, и все предыдущие дискуссии о наследовании и функции super () в Python немного у меня в голове.В настоящее время я использую следующий код для обновления значения родительского объекта.

#!/usr/bin/env python
# test.py

class Master(object):
    mydata = []
    def __init__(self):
        s1 = Sub1(self)
        s2 = Sub2(self)

class Sub1(object):
    def __init__(self,p):
        self.p = p
        self.p.mydata.append(1)

class Sub2(object):
    def __init__(self,p):
        self.p = p
        self.p.mydata.append(2)

if __name__ == "__main__":
    m = Master()
    print m.mydata

Эта командная строка возвращает следующее:

user @ host: ~ $ ./test.py
[1, 2]

Есть ли лучший способ сделать это с помощью super () вместо передачи ссылки "self" на ребенка?

Ответы [ 2 ]

3 голосов
/ 01 мая 2011

super применяется только к структурам наследования классов, где Sub1 и Sub2 являются подклассами Master.

В вашем примере вы используете структуру содержания, Sub1 и Sub2 являются атрибутами Master, и вы не используете super вызовов.

Кроме того, вы, как правило, действительно не хотите использовать изменяемый список в качестве атрибута класса;добавление к нему изменит одну копию списка (определенного в классе) глобально, а не на экземпляр;вместо этого инициируйте список в методе Master.__init__:

class Master(object):
    mydata = None
    def __init__(self):
        self.mydata = []

Функция __init__ вызывается для установки нового экземпляра, и, назначив новый пустой список для self, вы гарантируете, чтокаждый экземпляр имеет свою собственную копию.

1 голос
/ 01 мая 2011

Вот как бы вы сделали это по наследству.Сначала у вас есть Master, который является родительским классом, затем Sub1 и Sub2 наследуются от Master и становятся подклассами.Все подклассы могут обращаться к методам и переменным в родительском классе.Это может быть дубликатом: Вызов метода родительского класса из дочернего класса в Python?

#!/usr/bin/env python
# test.py

class Master(object):
    mydata = []
    def __init__(self):
        s1 = Sub1()
        s2 = Sub2()

class Sub1(Master):
    def __init__(self):
        super(Sub1, self).mydata.append(1)

class Sub2(Master):
    def __init__(self):
        super(Sub2, self).mydata.append(2)

if __name__ == "__main__":
    m = Master()
    print m.mydata
...