У меня уже установлен пайчарм (можно и другую среду разработки, можно и простой IDLE python) и библиотека ursina (статья как унастановить эту библиотеку). Тема по классам будет более понятна тем, кто уже знает что такое функции.
Сначала создам пустой мир, где есть главный игрок, земля и небо (могу управлять игроком и бегать по земле):
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
app = Ursina()
player = FirstPersonController()
# Земля
ground = Entity(
model='plane',
scale=(100, 1, 100),
texture='grass',
collider='box')
Sky()
app.run()

2. Добавлю сферу:
sphere = Entity(model="sphere")

3. Создание класса. Сначала информация о классе из официальной документации: «Классы предоставляют средство для объединения данных и функциональности. Создание нового класса создает новый тип объекта, позволяя создавать новые экземпляры этого типа. Каждый экземпляр класса может иметь атрибуты для поддержания своего состояния. Экземпляры классов также могут иметь методы (определенные самим классом) для изменения своего состояния.»
В моём примере мне класс нужен, так как я хочу создать много сфер, какие-то сферы будут красными, какие синие, другие будут иметь поведение – например, подпрыгивать и т.д. А что если мне таких сфер надо 1000 штук, мне теперь надо минимум 1000 строк кода писать? Нет, я создам класс, ведь суть у моего объекта одинакова – это такая же сфера.
Из документации:
Простейшая форма определения класса выглядит следующим образом:
class ClassName: <statement-1> <statement-N>
В моём случае я напишу:
class MySphere:
sphere = Entity(model="sphere")
Теперь добавлю init() – это позволит инициализировать мою сферу, то есть я создам сферу с определенными начальными настройками, например, пусть будет красная. Вот код:
class MySphere:
def __init__(self):
sphere = Entity(model="sphere")
sphere.color = color.red
После запуска я ожидаю увидеть красную сферу, вот только … Я не увижу вообще никакой сферы! А всё потому, что я не создала экземпляр класса.
Из официальной документации:
Для создания экземпляра класса используется функциональная нотация. Просто представьте, что объект класса — это функция без параметров, которая возвращает новый экземпляр класса. Например (при условии наличия указанного выше класса):
x = MyClass()
создает новый экземпляр класса и присваивает этот объект локальной переменной x.
В моём случае:
sphere_1 = MySphere()

То есть экземпляр класса, это и есть создание самой сферы и сохранение в переменную sphere_1. И если я захочу создать 5 разных сфер, то мне нужно создать 5 экземпляров класса, при этом я хочу чтобы у сфер были случайным образом сгенерированы координаты по оси х:
from ursina import *
from ursina.prefabs.first_person_controller import FirstPersonController
from random import randint
app = Ursina()
player = FirstPersonController()
ground = Entity(
model='plane',
scale=(100, 1, 100),
texture='grass',
collider='box'
)
Sky()
class MySphere:
def __init__(self):
sphere = Entity(model="sphere")
sphere.color = color.red
sphere.position = (randint(1,20),5,4)
sphere_1 = MySphere()
sphere_2 = MySphere()
sphere_3 = MySphere()
sphere_4 = MySphere()
sphere_5 = MySphere()
app.run()

4. Что такое self?
Это ссылка на конкретный экземпляр класс. То есть чтобы программа понимала, что сферы разные, на них нужны разные ссылки, и я, как программиста, могу отслуживать и изменять поведение моих сфер.
Поэтому перепишу код правильно:
class MySphere:
def __init__(self):
self.sphere = Entity(model="sphere")
self.sphere.color = color.red
self.sphere.position = (randint(1,20),5,4)
После запуска программы я визуально не вижу никаких изменений, их не будет сейчас. А вот если без self писать весь дальнейший код, то будет либо не так работать как я хочу, либо ошибка. Ведь через self я обращаюсь как-бы к каждой сфере отдельно при необходимости.
5. Добавление входных значений в класс
Теперь я хочу, чтобы при создании каждой сферы я указывала каким цветом будет эта сфера. Вот код:
class MySphere:
def __init__(self, my_color):
self.sphere = Entity(model="sphere")
self.sphere.color = my_color
self.sphere.position = (randint(10,20),5,4)
sphere_1 = MySphere(color.red)
sphere_2 = MySphere(color.blue)
sphere_3 = MySphere(color.green)
sphere_4 = MySphere(color.red)
sphere_5 = MySphere(color.red)

Такое введение в классы получилось.
Анонсы стримов твич, новые статьи и видео, ссылки на них и общаюсь я в своём телеграм канале. Давайте создадим сообщество школьников-программистов и будем создавать инетересные проекты и игры на python. Ссылка на телеграм канал ТЫК
Нужно продолжение статьи?
Комментарии (3)

GospodinKolhoznik
14.01.2026 14:52Это хорошо, что кто-то объяснил, что такое классы пошагово и с нуля. Я ещё в конце 90х впервые для себя стал разбираться в том, что такое классы. И долго не мог в них разобраться. Потом мне стало казаться, что я понял. А потом я прочитал книгу SICP и совсем перестал понимать, что же такое эти классы (хотя SICP вообще не про ООП, но после неё задаваёшься разными вопросами, о которых раньше не задумывался). Вот с тех пор я так и не знаю, что же такое классы, и если меня спросят, то понятия не имею что отвечать.

APh
14.01.2026 14:52Для четвероклассника норм. Но это тогда на другой сайт. Тут эту публикацию нужно удалить.
Genka_pokos
Мда