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