Я читал документы 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 обрабатывает Наследование и переопределение.Спасибо!
Нет. Суперкласс не может ничего знать о подклассе. Это означает, что если вы создаете экземпляр подкласса B, и он наследует метод foo ()
и переопределяет метод bar ()
, то при вызове foo ()
, который вызовет определение bar ()
в B, а не определение bar ()
в A. Это не то, что задумал автор суперкласса - он ожидал, что его вызов bar ()
, чтобы перейти к его собственному определению.
Нет, это означает, что если у вас есть следующий объект:
class B(A):
def bar(self):
print "from B"
и вы делаете
obj = B()
obj.foo()
то это выведет из B
как foo()
, который определен в базовом классе, вызывает bar()
, который также определен в базовом классе, но переопределен в производном классе.
По крайней мере, так я это понял.
Нет, любой объект, являющийся A
, вызовет A.bar
и напечатает « из A
»
Какой переопределенный метод вызывается, зависит от того, что является объектом , а не от того, какие другие классы могут быть производными от этого класса. Думайте о классе как о формочке для печенья, а об объекте как о куки.
Не совсем:
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