2008-10-01 13 views
6

He hecho algo de Python pero ahora estoy empezando a usar Ruby
Podría usar una buena explicación de la diferencia entre "self" en estos dos idiomas.¿Cuál es la diferencia entre las versiones de "sí mismo" de Ruby y Python?

obvio a primera vista:
Ser no es una palabra clave en Python, pero no es un valor "auto-como" no importa cómo lo llames.
Los métodos de Python se autocomo un argumento explícito, mientras que Ruby no.
Ruby a veces tiene métodos explícitamente definidos como parte de la notación de punto usando self.

googlear inicial revela
http://rubylearning.com/satishtalim/ruby_self.html
http://www.ibiblio.org/g2swap/byteofpython/read/self.html

+1

La versión de Python es más molesto :-) –

+1

bien, yo diría ... que está más presente. :) –

Respuesta

7

Python está diseñado para soportar más que solo la programación orientada a objetos. Preservar la misma interfaz entre métodos y funciones permite que los dos estilos interactúen más limpiamente.

Ruby se construyó desde la base para orientarse a objetos. Incluso los literales son objetos (evalúa 1.class y obtienes Fixnum). El lenguaje se creó de tal manera que self es una palabra clave reservada que devuelve la instancia actual donde sea que se encuentre.

Si está dentro de un método de instancia de uno de su clase, self es una referencia a dicha instancia.

Si estás en la definición de la clase en sí (no en un método), uno mismo es la propia clase:

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

A la hora de la definición de clase, 'Soy un C' se imprimirá.

La 'definición' recta define un método de instancia, mientras que 'def self.xxx' define un método de clase.

c=C.new 

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

¿Qué se debe hacer con una respuesta como esta que está realmente equivocada? La primera versión de Python publicada tenía un sistema de clase completa. –

+0

Decidió simplemente editar/corregir la parte falsa, pero estaría bien si los contestadores se abstuvieran de publicar cosas que se refutan fácilmente con solo echar un vistazo a la wikipedia. –

+0

¡Ay! Buena atrapada. En realidad no soy un desarrollador de Python, debería haber puesto un descargo de responsabilidad allí. Salí de la memoria de una entrevista hace unos 2 años con Guido van Rossum (en FLOSS Weekly) – webmat

5

Bueno, yo no sé mucho sobre Ruby. Pero el punto obvio del "yo" de Python es que no es una "palabra clave" ... es solo el nombre de un argumento que se envía a su método.

Puede usar cualquier nombre que desee para este argumento. "Ser" es solo una convención.

Por ejemplo:

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

x = X(6) 
x.p() 

imprime el número 6 en el terminal. En el constructor, el objeto propio se llama realmente a. Pero en el método p(), se llama b.

Actualización: En octubre de 2008, Guido señaló que contar con un auto explícita también era necesario para permitir que los decoradores de Python para ser lo suficientemente general para trabajar en funciones puras, métodos o classmethods: http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html

+1

Aún mejor, como los métodos son solo atributos de una clase, puedes definir 'class X: pass', luego' def foo (b): print b.x' totalmente fuera de la clase, y concluir por 'X.p = foo'. Esto es fantástico ya que puedes crear métodos como lambdas o incluso cierres. Ejemplo de caso de uso: métodos dinámicos 'clean_foo' para formularios Django. – Lloeki

5

auto se usa sólo como una convención, puede usar spam, tocino o salchicha en lugar de uno mismo y obtener el mismo resultado. Es solo el primer argumento pasado a los métodos enlazados. Pero síguese a usar el yo ya que confundirá a otros y a algunos editores.

5

A pesar de la afirmación de WebMAT, Guido wrote que la auto explícita "no es un truco aplicación - es un dispositivo semántica".

La razón de uno mismo método explícito en firmas definición semántica es consistencia. Si se escribe

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

Esto realmente es lo mismo que escribir

clase C: Pase

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

Esta fue una decisión de diseño intencional, no el resultado de introducir el comportamiento OO en una fecha posterior.

Todo en Python es un objeto, incluidos los literales.

Ver también Why must 'self' be used explicitly in method definitions and calls?

Cuestiones relacionadas