Как Python OOP сравнивается с PHP OOP? - PullRequest
16 голосов
/ 27 мая 2009

Мне просто интересно, есть ли в Python недостатки ООП, как в PHP. PHP разрабатывает свои методы ООП для последних нескольких версий. В PHP становится все лучше, но все еще не идеально. Я новичок в Python, и мне просто интересно, является ли поддержка ООП Python лучше или просто сопоставима.

Если в Python OOP есть некоторые проблемы, которые не следуют надлежащим методам OOP, я определенно хотел бы знать их. PHP, например, не допускает множественного наследования, насколько я знаю.

Спасибо всем!

Edit: Как насчет поддержки Public и Private? или поддержка переменных типов. Я думаю, что это важно для построения программного обеспечения ООП.

Ответы [ 6 ]

21 голосов
/ 27 мая 2009

Я бы сказал, что поддержка ООП в Python намного лучше, учитывая тот факт, что она была введена в язык в зачаточном состоянии, в отличие от PHP, который привел OOP к существующей процедурной модели.

8 голосов
/ 27 мая 2009

Поддержка ООП в Python очень сильна; он допускает множественное наследование, и все можно манипулировать как первоклассный объект (включая классы, методы и т. д.).

Полиморфизм выражается через типирование утки. Например, вы можете перебирать список, кортеж, словарь, файл, веб-ресурс и т. Д. Одним и тем же способом.

Есть много маленьких педантичных вещей, которые, к сожалению, не являются ОО, например, получение длины последовательности с помощью len (list), а не list.len (), но о них лучше не беспокоиться.

7 голосов
/ 27 мая 2009

Одним из необычных аспектов ООП-модели Python является механизм инкапсуляции. По сути, Python предполагает, что программисты не делают плохих вещей, и поэтому он не делает никаких попыток защитить закрытые переменные-члены или методы.

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

class foo:
    def public(self):
        return self.__private()
    def __private(self):
        return 5

print foo().public()
print foo()._foo__private()

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

Вот ссылка , объясняющая это более подробно.

3 голосов
/ 27 мая 2009

Также: Python имеет собственную перегрузку операторов, в отличие от PHP (хотя у него есть расширение). Любите это или ненавидите это, это там.

3 голосов
/ 27 мая 2009

Я думаю, что они сравнимы на данный момент. Как простой тест, я сомневаюсь, что в шаблонах проектирования или шаблонах архитектуры корпоративных приложений есть какой-либо шаблон, возможно, две наиболее влиятельные книги в ООП, которые невозможно реализовать ни на одном языке.

Оба языка с детства шли на дрожжах.

Что касается множественного наследования, оно часто создает больше проблем, чем решает , и в наши дни, как правило, не учитывается в языках как преднамеренное проектное решение.

1 голос
/ 27 мая 2009

Если вы ищете «более чистый» ООП, вы должны обратить внимание на SmallTalk и / или Ruby.

PHP значительно вырос благодаря поддержке ООП, но из-за того, как он работает (каждый раз перезагружается), все может стать очень медленным, если следовать рекомендациям ООП. Это одна из причин, по которой вы не много слышите о PHP на Rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...