Как решить AttributeError вызванный переопределенный метод - PullRequest
3 голосов
/ 02 апреля 2019

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

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

Я подумал, что мне, возможно, придется снова вызывать метод populate, но, похоже, это не так.

# some class that uses a method to populate one of it's attributes
class A:
    def __init__(self):
        self.populate()

    # The original populating method
    def populate(self):
        self.x = 5

my_obj = A()
print(my_obj.x)

# I can make a subclass that works fine AND has a new attribute
class B(A):
    def __init__(self):
        super().__init__()
        self.y = 9

    def populate(self):
        self.x = 5

my_obj = B()
print(my_obj.x)
print(my_obj.y)


class C(A):
    def __init__(self):
        super().__init__()
        self.z = 7
        self.populate()

    # This method overides the original one and causes an attribute error
    # because self.z is unknown
    def populate(self):
        self.x = self.z

my_obj = C()
print(my_obj.x)

1 Ответ

3 голосов
/ 02 апреля 2019

Проблема в том, что вам нужен атрибут x при инициализации вашего объекта CA.__init__ вызов self.populate() уже является методом переопределения, т. Е. C.populate и требует self.x.

. Вы можете установить self.z перед вызовом метода __init__ родителя:

class C(A):
    def __init__(self):
        self.z = 7
        super().__init__()

    def populate(self):
        self.x = self.z
...