Наследование Python: изменить родительский класс объекта - PullRequest
0 голосов
/ 17 декабря 2018

Мне нужно / я хочу изменить родительский класс и у меня проблемы с правильным импортом.Дочерний объект по-прежнему использует «старую» версию класса.

Файл A (некоторые библиотеки, которые я не хочу изменять напрямую):

class A(object):
    def __init__(self):
        self.contentA = "42"
        print("A.__init__() ausgeführt")
    def m(self):
        print("A.m() aufgerufen")
class B(A):
    def __init__(self):
        #A.__init__(self)
        super().__init__()
        self.contentB = "43"
        print("B.__init__() ausgeführt")
    def m(self):
        #A.m(self)
        super().m()
        print("B.m() aufgerufen")

Файл B :

import somelib as demo

class A(demo.A):
    def __init__(self):
        super().__init__()
    def f(self):
        '''
        new function for A!
        '''
        print("A.f():", self.contentA)

if __name__ == "__main__":
    b = demo.B()
    b.m()
    print("b.contentB: " + str(b.contentB))
    print("b.contentA: " + str(b.contentA))
    b.f() # not found!

Недавно добавленная функция f () не найдена.Как мне сделать это правильно?

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Ваша лучшая ставка, вероятно, исправление обезьяны, например:

import somelib as demo

def f(self):
    '''
    new function for A!
    '''
    print("A.f():", self.contentA)

demo.A.f = f


if __name__ == "__main__":
    b = demo.B()
    b.m()
    print("b.contentB: " + str(b.contentB))
    print("b.contentA: " + str(b.contentA))
    b.f() # should now be found!
0 голосов
/ 17 декабря 2018

То, что ваш класс также называется A, это не означает, что он будет перезаписывать ранее определенный класс A в другом модуле.Даже если это произойдет, класс B не будет зависеть от него автоматически.

Вероятно, вашу проблему лучше решить, написав унаследованный класс B в этом модуле, но если вы действительно хотите изменить родительский класскласс вы можете:

import somelib as demo

def f(self):
    '''
    new function for A!
    '''
    print("A.f():", self.contentA)

demo.A.f = f  # assign f to the f attribute of A

if __name__ == "__main__":
    b = demo.B()
    b.m()
    print("b.contentB: " + str(b.contentB))
    print("b.contentA: " + str(b.contentA))
    b.f() # found!
...