В чем разница между версиями self для Ruby и Python? - PullRequest
6 голосов
/ 02 октября 2008

Я сделал немного 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

Ответы [ 4 ]

7 голосов
/ 02 октября 2008

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
6 голосов
/ 03 октября 2008

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

Причина явного Я в методе определение сигнатуры семантическое консистенция. Если ты пишешь

класс C: def foo (self, x, y): ...

Это действительно то же самое, что и запись

класс C: пропуск

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

Это было намеренное проектное решение, а не результат введения ОО поведения на более позднем этапе.

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

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

5 голосов
/ 02 октября 2008

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

5 голосов
/ 02 октября 2008

Ну, я не знаю много о Руби. Но очевидное замечание о «я» 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 года Гвидо указал, что наличие явного "я" также необходимо для того, чтобы позволить декораторам Python быть достаточно общими для работы с чистыми функциями, методами или методами классов: http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

...