Как ООП на Python сравнивается с ООП на PHP?
Мне в основном интересно, есть ли у Python какие-либо недостатки в ООП, как у PHP. PHP развивает свои методы ООП в течение последних нескольких версий. Это становится лучше в PHP, но все еще не идеально. Я новичок в Python, и мне просто интересно, лучше ли поддержка ООП Python или просто сопоставима.
Если в Python ООП есть какие-то проблемы, которые не соответствуют надлежащей практике ООП, я определенно хотел бы знать об этом. PHP, например, не допускает множественного наследования насколько мне известно.
Спасибо Всем!
Редактировать: Как насчет поддержки государственного и частного секторов? или поддержка типов переменных. Я думаю, что это важно для создания программного обеспечения ООП.
6 answers
Я бы сказал, что поддержка ООП Python намного лучше, учитывая тот факт, что она была введена в язык в зачаточном состоянии, в отличие от PHP, который привязал ООП к существующей процедурной модели.
Поддержка ООП Python очень сильна; она допускает множественное наследование, и всем можно управлять как первоклассным объектом (включая классы, методы и т.д.).
Полиморфизм выражается через типирование уток. Например, вы можете повторять список, кортеж, словарь, файл, веб-ресурс и многое другое одним и тем же способом.
Есть много маленьких педантичных вещей, которые спорно не являются OO, например, получение длины последовательности с помощью len(список), а не list.len(), но лучше не беспокоиться о них.
Одним из необычных аспектов модели ООП Python является ее механизм инкапсуляции. В принципе, Python предполагает, что программисты не делают плохих вещей, и поэтому он ни в коей мере не старается защитить частные переменные-члены или методы.
Он работает, искажая имена участников, которые начинаются с двух подчеркиваний и заканчиваются менее чем двумя. Такие идентификаторы повсеместно изменяются таким образом, чтобы к ним добавлялось имя класса с дополнительным подчеркиванием перед тот. таким образом:
class foo:
def public(self):
return self.__private()
def __private(self):
return 5
print foo().public()
print foo()._foo__private()
Имена, начинающиеся и заканчивающиеся двумя (или более) символами подчеркивания, не искажаются, поэтому __init__
метод, используемый python для создания новых экземпляров, остается в покое.
Я думаю, что на данный момент они сопоставимы. В качестве простого теста я сомневаюсь, что в Шаблонах проектирования или Шаблонах архитектуры корпоративных приложений, возможно, двух самых влиятельных книгах по ООП, есть какой-либо шаблон, который невозможно реализовать ни на одном из языков.
Оба языка развивались семимильными шагами с момента их зарождения.
Что касается множественного наследования, то оно часто создает больше проблем, чем решает , и в наши дни, обычно исключается из языков как преднамеренное дизайнерское решение.
Также: Python имеет собственную перегрузку операторов, в отличие от PHP (хотя у него есть расширение). Нравится вам это или нет, но это есть.
Если вы ищете "более чистый" ООП, вам следует обратить внимание на SmallTalk и/или Ruby.
PHP значительно вырос благодаря поддержке ООП, но из-за того, как он работает (перезагружает все каждый раз), все может стать очень медленным, если следовать рекомендациям ООП. Это одна из причин, по которой вы мало слышите о PHP на Rails.