Что эквивалентно объектно-ориентированным конструкциям в python? - PullRequest
9 голосов
/ 15 июня 2009

Как Python обрабатывает объектно-ориентированные конструкции, такие как abstract , virtual , pure virtual etc

Примеры и ссылки были бы действительно хороши.

Ответы [ 2 ]

30 голосов
/ 15 июня 2009

Метод abstract - это метод, который (в базовом классе) вызывает NotImplementedError.

Абстрактный класс, как и в C ++, это любой класс, имеющий один или несколько абстрактных методов.

Все методы в Python являются виртуальными (то есть все могут быть переопределены подклассами).

«Чисто виртуальный» метод, вероятно, будет таким же, как и абстрактный.

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

Я стремился разобраться с частью "и т. Д." В двух книгах, дюжине видео, двух дюжинах эссе, PDF-файлах и других презентациях, и я не могу провести следующие несколько дней, суммируя все это здесь. Задайте конкретные вопросы, и я буду рад попытаться ответить!

7 голосов
/ 15 июня 2009

"Как python обрабатывает объектно-ориентированные конструкции, такие как абстрактные, виртуальные, чисто виртуальные и т. Д."

Это языковые конструкции, а не OO. Можно утверждать, что абстрактный - это независимая от языка концепция (даже если Python в ней не нуждается). Virtual и Pure Virtual - это детали реализации C ++.

Есть две ОО-конструкции, которые не нужны в Python, но иногда полезны.

Понятие «Интерфейс» имеет смысл, когда (1) у вас одиночное наследование и (2) у вас статическая проверка типов. Поскольку Python имеет множественное наследование и не требует статической проверки типов, концепция почти неактуальна.

Тем не менее, вы можете определить интерфейсные суперклассы, которые на самом деле ничего не делают, кроме определения интерфейса. Это удобно для документации. Одна идиома заключается в следующем.

class InterfaceMixin( object ):
    def requiredMethod( self ): raise NotImplemntedError()

class RealClass( SuperClass, InterfaceMixin ):
    def requiredMethod( self ):
         # actual implementation.

Понятие «абстрактный» имеет смысл, только если у вас есть статическая проверка типов, и вам нужно предупредить компилятор, что в одном или нескольких методах этого определения класса нет тела. Он также предупреждает компилятор о том, что вы не можете создавать экземпляры. Вам не нужно это в Python, потому что методы расположены динамически во время выполнения. Попытка использовать неопределенный метод - это просто AttributeError.

Самое близкое, что вы можете сделать такого рода вещи.

class AbstractSuperclass( object ):
    def abstractMethod( self ):
        raise NotImplementedError()

Это не совсем как Java или C ++ abstract. Это класс с методом, который вызывает ошибку. Но он ведет себя достаточно как абстрактный класс, чтобы быть полезным.

Чтобы соответствовать Java, вы должны запретить создание экземпляров. Это требует от вас переопределить __new__. Если бы вы сделали это, ваши конкретные подклассы должны были бы реализовать __new__, что является болью в шее, поэтому мы редко предпринимаем активные шаги, чтобы предотвратить создание экземпляров чего-то, что должно быть абстрактным.

Понятия «виртуальный» и «чистый виртуальный» - это оптимизации C ++, которые заставляют искать методы. Python всегда делает это.


Редактировать

Пример реферата без явного определения метода.

>>> class Foo( object ):
...     pass
... 
>>> f= Foo()
>>> f.bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...