La palabra clave self
Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 4 de 65.
Una función declarada en una clase se ejecuta en un objeto concreto: el que está antes del punto en la llamada. Dentro de la función, la palabra clave self se refiere a ese objeto.
# car.gd
class_name Car
extends RefCounted
var color: String = "Red"
var model: String = "Sedan"
func describe() -> void:
print("I am a %s %s" % [self.color, self.model])my_car.describe() ejecuta describe() con self establecido en my_car, así que la función lee las variables de ese auto. Nunca pasas self tú mismo:
var my_car := Car.new()
var taxi := Car.new()
taxi.color = "Yellow"
my_car.describe() # Soy un sedán rojo
taxi.describe() # Soy un sedán amarilloEscribir self. es opcional. Dentro de una función de clase, color por sí solo ya significa el color del objeto, así que print("I am a %s %s" % [color, model]) hace lo mismo.
Necesitas self cuando un parámetro tiene el mismo nombre que una variable de la clase. Dentro de la función, el nombre se refiere al parámetro, y self. selecciona la variable del objeto:
func repaint(color: String) -> void:
self.color = colorSin self., la línea color = color copia el parámetro sobre sí mismo y el auto conserva su color anterior.
Desafío
FácilCompleta las dos funciones de la clase Car en car.gd:
set_info(year, make, model)almacena sus tres parámetros en las variables del auto con los mismos nombresdescribe()devuelveThis car is a YEAR MAKE MODEL, por ejemploThis car is a 2020 Toyota Corolla
El código proporcionado lee cuántos autos vienen a continuación y luego una línea por cada auto (year make model). Crea cada auto, llama a set_info() e imprime describe() para cada auto. Para la línea 2020 Toyota Corolla, imprime:
This car is a 2020 Toyota CorollaTu código va en car.gd. main.gd contiene el código de entrada/salida proporcionado y no se puede editar.
Pruébalo tú mismo
extends Node
func _ready():
# Código de entrada/salida proporcionado: déjalo tal como está
var count := int(OS.read_string_from_stdin())
var cars: Array[Car] = []
for i in count:
var parts := OS.read_string_from_stdin().split(" ")
var car := Car.new()
car.set_info(int(parts[0]), parts[1], parts[2])
cars.append(car)
for car in cars:
print(car.describe())
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Fundamentos de la programación orientada a objetos
Archivos externosIntroducción a la programación orientada a objetosClases vs. objetosLa palabra clave selfMétodosPropiedadesConstructor (_init)Repaso: calculadora sencilla4Polimorfismo
Repaso de la sobrescritura de métodosTipado patoClases y métodos abstractosDiseño de interfacesRepaso: calculadora de formas7Señales
¿Qué es una señal?Declarar y emitirConectarse a las señalesSeñales con argumentosRepaso: sistema de salud10Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite2Propiedades de clase
Variables de instancia y estáticasFunciones estáticasMétodos setter de propiedadesMétodos getter de propiedadesPrivado por convenciónRepaso: administrador de cuentas bancarias5Encapsulación
Miembros públicos y privadosValidación con settersOcultación de informaciónPropiedades de solo lecturaRepaso: sistema de registros de estudiantes8Conceptos avanzados de POO
Composición frente a herenciaClases internasNodos como componentesRefCounted frente a NodeEnums en clases3Herencia
Herencia básicaLa palabra clave superSobrescritura de métodosCadenas de herenciaComprobaciones de tipo con isRepaso: jerarquía de empleados6Métodos especiales
Introducción a los métodos virtualesEl método _to_stringIteradores personalizadosRepaso: lista personalizada9Patrones de diseño, parte 1
Introducción a los patrones de diseñoPatrón SingletonPatrón FactoryPatrón ObserverPatrón StrategyPractica por tu cuenta: Compilador de GDScript online