2009-05-27 5 views
16

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

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

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

Редактировать: Как насчет поддержки государственных и частных? или поддержки переменных типов. Я думаю, что они важны для создания программного обеспечения OOP.

+15

С каких пор множественное наследование «правильный ООП»? Java не поддерживает множественное наследование. Каков ваш стандарт для «правильного ООП»? Можете ли вы предоставить ссылки или определение? –

+1

Это зависит от того, что вы определяете как «правильно». Многие языки ООП (Java, Objective-C, C#) не допускают множественного наследования. – Nosredna

+2

PHP не допускает множественного наследования по дизайну. Python, вероятно, следует этой практике. Это распространено на большинстве современных языков ООП, поскольку множественное наследование может привести к множеству головных болей, поскольку большинство людей не используют его должным образом. –

ответ

21

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

+0

Интересно. Я думал, что классы были добавлены относительно поздно в развитии Python, но в блоге Guido говорится, что он был добавлен до первого публичного выпуска. –

+0

Джейсон: Они были пересмотрены, хотя. – troelskn

+0

1+ для Python. ООП в PHP - это беспорядок. Я не пытаюсь продвигать Python другим разработчикам (т. Е. Меньше работать для меня), но я начал с PHP и после кодирования в Python я бы не стал использовать PHP-проект менее 5 раз для его реальной стоимости (т. Е. Небольшой динамический сайт в CodeIgniter за 50k, без преувеличения). Никто не заплатил бы столько, хотя, поэтому я думаю, что вы получите картину. – orokusaki

3

Я думаю, что они сопоставимы на данный момент. В качестве простого теста я сомневаюсь, что в Design Patterns или Patterns of Enterprise Application Architecture есть одна модель, возможно, две наиболее влиятельные книги в ООП, которые невозможно реализовать на любом языке.

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

Что касается множественного наследования, то он часто creates more problems than it solves, и в наши дни обычно упускается из языков как намеренное дизайнерское решение.

+9

Вы также можете реализовать любой шаблон проектирования в C. Is C как объектно-ориентированный, как Python? –

+0

Ум. Ссылка на статью в Википедии описывает проблемы, которые имеет MI, и как они рассматриваются на разных языках. Решение Python (MRO) также описано в статье. Я не уверен, что вы достигли, связавшись со статьей. – tzot

8

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

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

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

+6

Под «debatably not OO» вы подразумеваете «не типичный синтаксис OO?» Это явно OO, так как это метод __len__ объекта. –

+3

@S. Лотт. Я подозреваю, что это именно то, что он имеет в виду. Реализация - правильно OO, но синтаксис - нет. Длина последовательности является аспектом объекта последовательности; В идеале синтаксис языка выражал бы это таким образом. –

+3

@Ben: Не реализация важнее синтаксиса? Или вы считаете, что перегрузка оператора «не является надлежащим ООП», потому что синтаксис неверен? Вы предпочли бы 1.minus() -1, потому что это больше OO? Я действительно не понимаю, как люди могут жаловаться на проблему с len. – nikow

3

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

1

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

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

+0

А также потому, что возможности метапрограммирования PHP не могут соответствовать Ruby или Smalltalk, или даже Python. –

7

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

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

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

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

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

Вот link, объяснив это более подробно.

+0

Другой способ - имена, начинающиеся с двух символов подчеркивания (и заканчивающиеся менее чем на 2 символа подчеркивания), искажены, но других имен нет. – mipadi

+0

@TokenMacGuy: пожалуйста, исправьте свой ответ, а не говорите, что это «немного неправильно». –

+1

свойства могут использоваться для управления доступом к атрибутам. Но иногда я хотел бы иметь истинные частные атрибуты. –