Вызов методов Overriden в производном классе от базового класса

Я читал документы Python о классах и столкнулся с этим абзацем, в котором я не уверен:

Производные классы могут переопределить методы своих базовых классов. Поскольку методы не имеют никаких специальных полномочий при вызове других методов того же объекта, метод базового класса, который называет другой метод определенным в том же базовом классе, может закончить тем, что назвал метод производного класса, который переопределяет его. (Для программистов на C++: все методы в Python являются эффективно виртуальными.)

Пример:

class A:
    def foo(self):
        self.bar()

    def bar(self):
        print "from A"

class B(A):
    def foo(self):
        self.bar()

    def bar(self):
        print "from B"

Делает это означает что объект класса A obj = A() может так или иначе закончить тем, что печатал "от B"? Я читаю это правильно? Я приношу извинения, если это не имеет смысла. Я немного смущен относительно того, как Python обрабатывает Наследование и переопределение.Спасибо!

8
задан Rex Hunt 18 June 2010 в 23:43
поделиться

4 ответа

Нет. Суперкласс не может ничего знать о подклассе. Это означает, что если вы создаете экземпляр подкласса B, и он наследует метод foo () и переопределяет метод bar () , то при вызове foo () , который вызовет определение bar () в B, а не определение bar () в A. Это не то, что задумал автор суперкласса - он ожидал, что его вызов bar () , чтобы перейти к его собственному определению.

8
ответ дан 5 December 2019 в 14:00
поделиться

Нет, это означает, что если у вас есть следующий объект:

class B(A):
    def bar(self):
        print "from B"

и вы делаете

obj = B()
obj.foo()

то это выведет из B как foo(), который определен в базовом классе, вызывает bar(), который также определен в базовом классе, но переопределен в производном классе.

По крайней мере, так я это понял.

1
ответ дан 5 December 2019 в 14:00
поделиться

Нет, любой объект, являющийся A , вызовет A.bar и напечатает « из A »

Какой переопределенный метод вызывается, зависит от того, что является объектом , а не от того, какие другие классы могут быть производными от этого класса. Думайте о классе как о формочке для печенья, а об объекте как о куки.

0
ответ дан 5 December 2019 в 14:00
поделиться

Не совсем:

class A:
   def foo(self):
       self.bar()

   def foo2(self):
       self.bar2()

   def bar(self):
       print "Bar A"

   def bar2(self):
       print "Bar2 A"

class B(A):
   def bar(self):
       print "Bar B"

objA = A()
objA.foo()
objA.foo2()

objB = B()
objB.foo()
objB.foo2()

Вывод:

Bar A
Bar2 A
Bar B
Bar2 A
0
ответ дан 5 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: