Я сделал немного 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
ну я бы сказал ... больше настоящего. :)






Ну, я мало что знаю о Руби. Но очевидная особенность «я» 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.
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 имела полную систему классов.
Решил просто отредактировать / исправить ложную часть, но было бы неплохо, если бы респонденты воздержались от публикации вещей, которые легко опровергнуть, взглянув на википедию.
Ой! Хороший улов. На самом деле я не Python-разработчик, мне следовало написать заявление об отказе от ответственности. Я пошел по памяти из интервью примерно 2 года назад с Гвидо ван Россумом (на FLOSS Weekly)
Также стоит отметить, что литералы в Python являются полными объектами, как и в Ruby. Оценка (1) .__ class__ дает вам <type 'int'>. Есть разница в токенизаторе (не связанном с объектной системой), который обрабатывает «1». как float, но с использованием скобок или «1 .__ class__» будет работать должным образом.
Несмотря на заявление 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 -это объект, включая литералы.
См. Также Почему в определениях и вызовах методов должно явно использоваться «я»?
Версия на питоне раздражает больше :-)