Проблема множественного наследования в Python! - PullRequest
3 голосов
/ 13 января 2011

Почему c.print_a () выводит 'B'?

class A(object):
    def __init__(self):
        self.some_name = 'A'

    def print_a(self):
        print self.some_name

class B(object):
    def __init__(self):
        self.some_name = 'B'

    def print_b(self):
        print self.some_name

class C(A, B):
    def __init__(self):
        A.__init__(self)
        B.__init__(self)

if __name__ == '__main__':
    c = C()
    c.print_a()

class A(object):
    def __init__(self, some_name='A'):
        self.some_name = some_name

    def print_a(self):
        print self.some_name

class B(object):
    def __init__(self, some_name='B'):
        self.some_name = some_name

    def print_b(self):
        print self.some_name

class C(A, B):
    def __init__(self):
        A.__init__(self, some_name='AAAAA')
        B.__init__(self, some_name='BBBBB')

if __name__ == '__main__':
    c = C()
    c.print_a()

Ответы [ 3 ]

5 голосов
/ 13 января 2011

У вас есть только один объект здесь;свойство some_name является общим для методов всех унаследованных классов.Вы вызываете A.__init__, который устанавливает A, затем B.__init__, который меняет его на B.

Также обратите внимание, что вы вызываете базовые методы неправильно;используйте super:

class A(object):
    def __init__(self):
        self.some_name = 'A'
        super(A, self).__init__()

    def print_a(self):
        print self.some_name

class B(object):
    def __init__(self):
        self.some_name = 'B'
        super(B, self).__init__()

    def print_b(self):
        print self.some_name

class C(A, B):
    def __init__(self):
        super(C, self).__init__()

if __name__ == '__main__':
    c = C()
    c.print_a()
1 голос
/ 13 января 2011

Скажем, вы хотите, чтобы C установил имена для некоторых объектов типов A и B, а затем вызовите некоторые методы print_a и print_b для объектов типа C, чтобы получить эти имена обратно?

Вы можете получить этот тип поведения, используя модель наследования C ++, но модель Python сильно отличается. Только один объект с одним набором полей. Если вам нужно поведение C ++, возможно, самый простой способ - объявить подобъекты (и это выглядит как обычное злоупотребление наследованием над композицией).

Похоже, вы пытаетесь сделать что-то вроде ниже:

class Printable(object):
    def __init__(self, name):
        self.name = name

    def myprint(self):
        print self.name

class C(object):
    def __init__(self):
        self.a = Printable('A')
        self.b = Printable('B')

    def print_a(self):
        self.a.myprint()

    def print_b(self):
        self.a.myprint()

if __name__ == '__main__':
    c = C()
    c.print_a()
1 голос
/ 13 января 2011

Есть только один self, и вы перезаписываете его some_name в B.__init__. Возможно, вы привыкли к C ++, где будет два отдельных поля, A.some_name и B.some_name. Эта концепция не применяется к Python, где атрибуты создаются динамически при назначении.

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