Ключевое слово self
Часть раздела Объектно-ориентированное программирование путешествия по GDScript на Coddy. Урок 4 из 65.
Функция, объявленная в классе, выполняется для конкретного объекта: того, который стоит перед точкой при вызове. Внутри функции ключевое слово self ссылается на этот объект.
# 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() запускает describe(), установив self в my_car, поэтому функция читает переменные этой машины. Передавать self самостоятельно не нужно:
var my_car := Car.new()
var taxi := Car.new()
taxi.color = "Yellow"
my_car.describe() # Я красный седан
taxi.describe() # Я жёлтый седанПисать self. необязательно. Внутри функции класса color само по себе уже означает color объекта, поэтому print("I am a %s %s" % [color, model]) делает то же самое.
Тебе нужен self, когда параметр имеет то же имя, что и переменная класса. Внутри функции это имя обозначает параметр, а self. указывает на переменную объекта:
func repaint(color: String) -> void:
self.color = colorБез self. строка color = color копирует параметр сам в себя, и автомобиль сохраняет свой прежний цвет.
Задание
ЛегкоЗаверши две функции класса Car в файле car.gd:
set_info(year, make, model)сохраняет три параметра в переменных автомобиля с такими же именамиdescribe()возвращаетThis car is a YEAR MAKE MODEL, напримерThis car is a 2020 Toyota Corolla
Предоставленный код считывает количество следующих автомобилей, а затем по одной строке для каждого автомобиля (year make model). Он создаёт каждый автомобиль, вызывает set_info() и выводит результат describe() для каждого автомобиля. Для строки 2020 Toyota Corolla он выводит:
This car is a 2020 Toyota CorollaТвой код нужно поместить в car.gd. В main.gd находится предоставленный код ввода/вывода, который нельзя редактировать.
Попробуйте сами
extends Node
func _ready():
# Предоставленный код ввода-вывода: оставьте его без изменений
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())
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово selfМетодыСвойстваКонструктор (_init)Повторение: простой калькулятор4Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур7Сигналы
Что такое сигнал?Объявление и отправкаПодключение к сигналамСигналы с аргументамиПовторение — система здоровья10Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»2Свойства классов
Переменные экземпляра и классаСтатические функцииСеттеры свойствГеттеры свойствПриватность по соглашениюПовторение — менеджер банковского счёта5Инкапсуляция
Открытые и закрытые членыПроверка данных с помощью сеттеровСокрытие информацииСвойства только для чтенияПовторение — система учета студентов8Продвинутые концепции ООП
Композиция и наследованиеВнутренние классыУзлы как компонентыRefCounted и NodeПеречисления в классах11Проект: Управление библиотекой
Обзор проектаКлассы книг и пользователей3Наследование
Основы наследованияКлючевое слово superПереопределение методовЦепочки наследованияПроверка типов с помощью isПовторение — иерархия сотрудников6Специальные методы
Введение в виртуальные методыМетод _to_stringПользовательские итераторыПовторение: пользовательский список9Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Онлайн-компилятор GDScript