Python изменился на более объектно-ориентированный?

Здесь новичок, поэтому, пожалуйста, дайте мне знать, если я в порядке, но я бы сделал это так:

def prime(n):
    count = 0
    for i in range(1, (n+1)): 
         if n % i == 0: 
             count += 1
    if count > 2:
        print "Not a prime"
    else:
        print "A prime"
9
задан Peter Mortensen 2 March 2010 в 20:34
поделиться

6 ответов

Цзянь Линь - ответ - «Да», Python более объектно-ориентирован, чем когда Матц решил, что хочет создать Ruby, и в обоих языках теперь есть функция «все является объектом». Когда Python был моложе, у «типов», таких как строки и числа, отсутствовали методы, тогда как «объекты» были построены с помощью оператора «class» (или путем преднамеренного построения класса в модуле расширения C) и были немного менее эффективными, но поддерживали методы и наследование. В самом начале 1990-х, когда быстрая 386-я машина была довольно хорошей машиной, этот компромисс имел смысл. Но типы и классы были унифицированы в Python 2.2 (выпущенном в 2001 году), а строки получили методы, а в более поздних версиях Python пользователи могут даже создавать подклассы от них.

Итак: Python определенно был в одно время менее объектно-ориентированным; но, насколько мне известно, все эти старые преграды исчезли.

Вот руководство по произошедшей унификации:

http: //www.python. org / download / Release / 2.2 / descrintro /

Пояснение: возможно, я могу выразить это еще проще: в Python все всегда было объектом; но некоторые базовые типы объектов (целые числа, строки) когда-то воспроизводятся по «другим правилам», которые не позволяют использовать с ними методы объектно-ориентированного программирования (например, наследование). Теперь это исправлено. Метод len (), описанный в другом ответе здесь, вероятно, единственное, что мне хотелось бы изменить в Гвидо при обновлении до Python 3.0. Но, по крайней мере, он дал мне понимание словаря, так что я не буду слишком громко жаловаться. : -)

40
ответ дан 4 December 2019 в 05:53
поделиться

Я не уверен, что верю аргументу, что Ruby более объектно-ориентирован, чем Python. Объектно-ориентированный подход - это не только использование объектов и точечного синтаксиса. Распространенный аргумент, который я вижу, заключается в том, что в Python для получения длины списка вы делаете что-то вроде этого:

len(some_list)

Я рассматриваю это как аргумент bikeshed . На самом деле это означает (почти напрямую) следующее:

some_list.__len__()

идеально объектно-ориентированный. Я думаю, что Rubyists может немного запутаться, потому что обычно объектно-ориентированный подход подразумевает использование точечного синтаксиса (например, object.method () ). Однако, если я неправильно понимаю аргументы рубистов, дайте мне знать.

Независимо от объектной ориентации этого способа, у использования len есть одно преимущество. Одна вещь, что ' В некоторых языках меня всегда раздражало то, что мне приходилось помнить, использовать ли some_list.size () или some_list.length () или some_list.len для конкретного объект. Путь Python означает, что нужно запомнить только одну функцию

12
ответ дан 4 December 2019 в 05:53
поделиться

Погодите, Ruby и Python объектно-ориентированы. Объекты есть объекты. Нет более объектно-ориентированной «функции сравнения», которая приведет вас к лучшему. Синтаксис - это не только то, что делает некоторый язык похожим на объектно-ориентированный, но также модель данных .

Объекты - это абстракция Python для данных. Все данные в программе Python представлены объектами или отношениями между объектами. (В некотором смысле и в соответствии с моделью фон Неймана «компьютер с хранимой программой» код также представлен объектами.) http://docs.python.org/reference/datamodel.html

2
ответ дан 4 December 2019 в 05:53
поделиться

This is an incorrect belief.

See my previous answer here for more in-depth explanation:

Is everything an object in python like ruby?

Why not expose .len() directly off of list then? I think you can't completely divorce OO design from the syntax, because the syntax, to a large extent, defines your code paradigm. some_list.len() is OO because you are thinking about the list as an object that will be able to tell you what its length is. len(some_list)

.len() is available directly off the list. It is available as __len__(). len() is a function object. You can see all its methods with dir(len). While I do not know why Guido decided to make the __len__() method longer, it does not change the fact that all of those are still objects.

2
ответ дан 4 December 2019 в 05:53
поделиться

Хотя это неправильный ответ ... Почему вас волнует, что Python более или менее объектно-ориентированный? Самое классное в Python то, что он питонический , не объектно-ориентированный или функциональный, или какой-либо другой парадигма, которая модна в данный момент! : -)

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

см .:

7
ответ дан 4 December 2019 в 05:53
поделиться

У меня такое же "восприятие" , возможно, полученное из этого:

Почему изначально был создан python:

Мне пришло в голову, что сценарий язык с синтаксисом вроде ABC [...] восполнит потребность

Интервью с создателем Ruby:

«Мне нужен язык сценариев, который был бы более мощным, чем Perl, и более объектно-ориентированным, чем Python

Я знаю, что восприятие - это не то же самое, что реальность. И Python, и Ruby - отличные языки программирования, и оба очень объектно ориентированы.

1
ответ дан 4 December 2019 в 05:53
поделиться