В чем разница между версиями «self» для Ruby и Python?

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

На первый взгляд очевидно:
Self не является ключевым словом в Python, но существует «подобное себе» значение, как бы вы его ни называли. Методы Python получают self как явный аргумент, тогда как Ruby - нет. Иногда в Ruby есть методы, явно определенные как часть себя с использованием точечной нотации.

Первоначальный поиск в Google показывает
http://rubylearning.com/satishtalim/ruby_self.html
http://www.ibiblio.org/g2swap/byteofpython/read/self.html

Версия на питоне раздражает больше :-)

Orion Edwards 02.10.2008 04:07

ну я бы сказал ... больше настоящего. :)

John Mulder 06.10.2008 20:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
2
1 484
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ну, я мало что знаю о Руби. Но очевидная особенность «я» Python заключается в том, что это не «ключевое слово» ... это просто имя аргумента, отправляемого вашему методу.

Вы можете использовать любое имя для этого аргумента. «Я» - это просто условность.

Например :

class X :
    def __init__(a,val) :
        a.x = val
    def p(b) :
        print b.x

x = X(6)
x.p()

Печатает цифру 6 на терминале. В конструкторе объект self на самом деле называется a. Но в методе p () он называется b.

Обновление: в октябре 2008 года Гуидо указал, что наличие явного self также необходимо, чтобы позволить декораторам Python быть достаточно общими для работы с чистыми функциями, методами или методами классов: http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

Еще лучше, поскольку методы - это просто вызываемые атрибуты класса, вы можете определить class X: pass, затем def foo(b): print b.x полностью вне класса и завершить с помощью X.p = foo. Это фантастика, поскольку вы можете создавать методы в виде лямбда-выражений или даже замыканий. Пример использования: динамические методы clean_foo для форм Django.

Lloeki 08.07.2011 13:56

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

Ответ принят как подходящий

Python разработан для поддержки не только объектно-ориентированного программирования. Сохранение одного и того же интерфейса между методами и функциями позволяет двум стилям взаимодействовать более чисто.

Ruby изначально создавался как объектно-ориентированный. Даже литералы являются объектами (оцените 1.class, и вы получите Fixnum). Язык был построен таким образом, что self является зарезервированным ключевым словом, которое возвращает текущий экземпляр, где бы вы ни находились.

Если вы находитесь внутри метода экземпляра одного из своих классов, self является ссылкой на указанный экземпляр.

Если вы находитесь в определении самого класса (а не в методе), self - это сам класс:

class C
  puts "I am a #{self}"
  def instance_method
    puts 'instance_method'
  end
  def self.class_method
    puts 'class_method'
  end
end

Во время определения класса будет напечатано «Я - Т».

Прямое def определяет метод экземпляра, тогда как def self.xxx определяет метод класса.

c=C.new

c.instance_method
#=> instance_method
C.class_method
#=> class_method

Что делать с таким ответом, который фактически неверен? Самая первая опубликованная версия Python имела полную систему классов.

John Millikin 03.10.2008 07:27

Решил просто отредактировать / исправить ложную часть, но было бы неплохо, если бы респонденты воздержались от публикации вещей, которые легко опровергнуть, взглянув на википедию.

John Millikin 03.10.2008 07:34

Ой! Хороший улов. На самом деле я не Python-разработчик, мне следовало написать заявление об отказе от ответственности. Я пошел по памяти из интервью примерно 2 года назад с Гвидо ван Россумом (на FLOSS Weekly)

webmat 08.10.2008 05:22

Также стоит отметить, что литералы в Python являются полными объектами, как и в Ruby. Оценка (1) .__ class__ дает вам <type 'int'>. Есть разница в токенизаторе (не связанном с объектной системой), который обрабатывает «1». как float, но с использованием скобок или «1 .__ class__» будет работать должным образом.

Brian 10.10.2008 01:30

Несмотря на заявление Webmat, Гвидо написал, что явное Я - это «не взлом реализации, а семантическое устройство».

The reason for explicit self in method definition signatures is semantic consistency. If you write

class C: def foo(self, x, y): ...

This really is the same as writing

class C: pass

def foo(self, x, y): ... C.foo = foo

Это было намеренное дизайнерское решение, а не результат введения объектно-ориентированного поведения в последнее время.

Все в Python -это объект, включая литералы.

См. Также Почему в определениях и вызовах методов должно явно использоваться «я»?

Другие вопросы по теме