Причуда в Python по множественному наследованию!По крайней мере я так думаю - PullRequest
1 голос
/ 13 октября 2011

Я работал над кодом множественного наследования, который выглядит примерно так:

class Document():
    def save(self, x):
        print "inside Document from " + x

class Cdm(object):
    def save(self,x):
        print "inside Cdm from " + x
        super(Cdm,self).save('Cdm')

class Contacts(Cdm, Document):
    def __init__(self):
        self.save('Contacts')  

Это результат, который я получаю при создании экземпляра контактов.

> c = Contacts()
< inside Cdm from Contacts
< inside Document from Cdm

Теперь это просто странно, возможно, на мой взгляд. Я мог что-то неправильно понять. Как видите, класс Contacts наследуется от cdm и Document. Я пытаюсь использовать метод сохранения Cdm из контактов. Но Cdm наследует от объекта и не имеет метода суперкласса, называемого save, но при этом вызывает функцию save из класса Document. В программе то, над чем я работаю, это поведение, которое я хочу, но я волнуюсь, так как теоретически это не должно работать или, по крайней мере, я так думаю.

Есть ли у вас какие-либо комментарии по этому поводу. Или я неправильно понял наследство Питона.

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Как Документация Python говорит:

super (): вернуть прокси-объект, который делегирует вызовы метода родительскому или родственному классу типа.

В этой ситуации super(Cdm,self).save('Cdm') вызовет версию save(), которая является следующей в порядке разрешения методов. В этом случае это метод save() в классе Document, потому что это родственный класс Cdm (т.е. это второй базовый класс Contacts).

Отличное практическое объяснение super() можно найти здесь: Super () Python считается супер!

1 голос
/ 13 октября 2011

super(Cdm,self).save('Cdm') вызывает метод save следующего класса в mro.Это не может быть прямым родителем текущего класса.

Для получения дополнительной информации о том, как работает super и для чего его можно использовать, вы можете обратиться к документации и thisсообщение в блоге .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...