Я относительно новичок в Python и пришел из языка (Java) с совершенно другим взглядом на ООП.В большинстве случаев я понимаю, как делать в Python то, что я делал в Java, но я все еще борюсь с новой философией.В частности, я не уверен, что полностью понимаю наследование и создание экземпляров.Ниже я напишу, каково мое нынешнее понимание этих двух понятий в Python: Пожалуйста, исправьте меня, если я говорю неправильно, подтвердите, если это правильно, или добавьте любое уточнение, которое, по вашему мнению, необходимо.
(1) Наследование - это отношение между объектами (не между классами), если объект obj1
наследуется от объекта obj2
и упоминание атрибута attr
не может быть разрешено впространство имен obj1
, Python попытается разрешить attr
в пространстве имен obj2
(то есть obj1.attr
станет фактически obj2.attr
).И это все.Нет другой семантики, связанной с концепцией наследования.
(2) Когда мы определяем класс с кодом вида class A(B): …
, A
на самом деле не наследует B
(то естьсоздаваемый нами объект класса A
не наследует объект класса B
в смысле (1)).Этот оператор только указывает, что экземпляр A
будет наследовать B
.Так, например, из кода A
у нас не будет доступа к статическим методам B
(если мы не достигнем их с помощью ограждающей или глобальной области видимости).
(3) Anинстанцирование является формой наследования, код x = A()
создает объект x
, который наследует классы A
и B
(в этом порядке, в смысле (1)).
Вкратце, создание экземпляров - это наследование (это было действительно трудно для меня принять), а классы (то есть объекты классов) не наследуют, их экземпляры делают.
РЕДАКТИРОВАТЬ:
Для пояснения немноговопрос, рассмотрим следующий код:
class Context:
class A:
def salute(): print('hello')
class B(A):
def __init__(self): A.salute()
B()
Этот wont'run, A.salute()
не наследуется в смысле Java.