Menu
CoddyTech

Variables de instancia y estáticas

Parte de la sección Programación orientada a objetos del Journey de GDScript de Coddy. Lección 9 de 65.

Un var normal en una clase es una variable de instancia: cada objeto tiene la suya. Un static var pertenece a la clase: hay un único valor compartido por todos los objetos.

# student.gd
class_name Student
extends RefCounted

static var school: String = "Godot High"
static var count: int = 0
var student_name: String

func _init(new_name: String) -> void:
	student_name = new_name
	count += 1
var ada := Student.new("Ada")
var bo := Student.new("Bo")
print(Student.count) # 2
print(ada.student_name, " and ", bo.student_name) # Ada y Bo
Student.school = "Godot Academy"
print(ada.school) # Godot Academy
print(bo.school) # Godot Academy

Lee una variable estática mediante el nombre de la clase, como Student.count, sin necesitar ningún objeto. Dentro de la clase, usa su nombre: count += 1 en _init() cuenta a todos los estudiantes creados hasta el momento.

Cambiar Student.school lo cambia para todos los estudiantes a la vez. ada.school = "Night School" haría lo mismo, porque solo hay un school; escribir el nombre de la clase lo deja claro.

Una const se comparte de la misma manera, pero nunca puede cambiar. Usa una static var para los datos compartidos que cambian mientras se ejecuta el programa, como un contador o una configuración que siguen todos los objetos.

challenge icon

Desafío

Fácil

Completa la clase BankAccount en bank_account.gd:

  • una variable int estática interest_percent que empieza en 2, compartida por todas las cuentas
  • una variable int estática account_count que empieza en 0; el constructor le suma 1 por cada cuenta nueva
  • describe() devuelve HOLDER: $BALANCE at PERCENT%, usando holder y balance de la cuenta, y el interest_percent compartido

El código proporcionado lee cuántas cuentas siguen y una línea holder balance para cada una, y después una nueva tasa de interés. Imprime BankAccount.account_count y cada cuenta, establece BankAccount.interest_percent en la nueva tasa e imprime cada cuenta otra vez. Para Alice 1000, Bob 2000 y la tasa 3, imprime:

Accounts opened: 2
Alice: $1000 at 2%
Bob: $2000 at 2%
After the rate change:
Alice: $1000 at 3%
Bob: $2000 at 3%

Tu código va en bank_account.gd. main.gd contiene el código proporcionado de entrada/salida 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 accounts: Array[BankAccount] = []
	var count := int(OS.read_string_from_stdin())
	for i in count:
		var parts := OS.read_string_from_stdin().split(" ")
		accounts.append(BankAccount.new(parts[0], int(parts[1])))
	print("Accounts opened: %d" % BankAccount.account_count)
	for account in accounts:
		print(account.describe())
	BankAccount.interest_percent = int(OS.read_string_from_stdin())
	print("After the rate change:")
	for account in accounts:
		print(account.describe())
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de GDScript online