Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211

Указать тип для self

25.06.2025, 04:12. Показов 1496. Ответов 14

Студворк — интернет-сервис помощи студентам
В одной библиотеке видел как для self указывали тип другого класса и использовали. Выглядело это примерно так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class User:
    def __init__(self):
        self.name = "Вася"
 
    def get_name(self):
        return self.name
 
 
class Person:
    def test(self: User):  # другой тип
        self.get_name()  # PyCharm ошибки не выдает
 
 
u = User()
print(u.test())  # error
Мне это напоминает методы расширения из C#.
Конкретно мой пример не рабочий, хотя в библиотеке это схема работала. Гугл слабо помогает в этом вопросе, единственное что нашел похоже на доку, хотя там упоминаются классы Self и TypeVar, что в читаемой мною библиотеке я не наблюдал. Просто хочется понять, что это, как это работает и что я упустил в своем примере?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2025, 04:12
Ответы с готовыми решениями:

Для чего служит ключевое слово «self». Например, def __init__(self):?
Для чего служит ключевое слово «self». Например, def __init__(self):? 1) Это общая переменная для...

__init__(self, winner, year, category) ;__str__(self)
Создайте класс NobelWinner. У экземпляра класса NobelWinner должны быть атрибуты: · winner – ФИО...

Что такое self.assertEqual() из unittest?
вообщем, всем привет! у меня такой вопрос возник что такое self.assertEqual и для чего оно вообще...

14
115 / 100 / 15
Регистрация: 24.07.2019
Сообщений: 308
25.06.2025, 05:24
почему во втором классе нет инициализатора?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
25.06.2025, 07:49
Цитата Сообщение от Enifan Посмотреть сообщение
что я упустил в своем примере?
наследование. В твоем примере классы никак не связаны, с чего бы объекту класса быть типа не связанного с ним? Да и как он методы другого класса сможет вызвать, если не наследник?
То есть или наследование и его фишки или передавать объект другого класса в метод/инит
1
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
25.06.2025, 08:19  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
наследование
Не в этом случаи, по крайней мере в исходниках не наблюдаю наследования. Если только оно не указано в отдельном файле (возможно ли так?)
Цитата Сообщение от Welemir1 Посмотреть сообщение
с чего бы объекту класса быть типа не связанного с ним?
1) Разбиение функций класса на несколько файлов, дабы не держать 10 тысяч строк кода в одном файле.
2) Расширение функционала уже имеющихся классов из библиотек, которые были заброшены а новый функционал нужен (для этого и были придуманы методы расширения в шарпе)

Почему нельзя передать объект и работать с ним как обычной функцией - так то оно можно, вопрос в деликатности кода. Чуть поменяю пример и допустим хотим добавить юзеру функцию ходить. Как это будет выглядеть
Python
1
2
user.go()
Go.go(user)  # передали объект в статичную функцию
Очевидно что 1-ый вариант куда симпотней и логичней.
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
25.06.2025, 08:29
Enifan, я не знаю о каких исходниках ты говоришь, потому тут прокомментировать не могу

Цитата Сообщение от Enifan Посмотреть сообщение
1) Разбиение функций класса на несколько файлов, дабы не держать 10 тысяч строк кода в одном файле.
такого не бывает, класс всегда в одном файле, а если в нем 10 тысяч строк, то вы что-то делаете не так, он у вас умеет/знает слишком много. Разбивайте, декомпозируйте, подумайте - точно ли все это должен уметь один класс.

Цитата Сообщение от Enifan Посмотреть сообщение
2) Расширение функционала уже имеющихся классов из библиотек
да, как я и написал, унаследовался и расширил. Или агрегировал и расширил.

Цитата Сообщение от Enifan Посмотреть сообщение
Почему нельзя передать объект и работать с ним как обычной функцией
да, как я и написал -передать объект класса в метод или в инит другого класса, чтобы агрегировать и можно работать с ним
3
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
25.06.2025, 09:18
без исходника это анализировать сложно. Аннотация self имеет смысл только при наследовании от аннотированного класса, в данном случае линтер всегда будет давать ошибку.
0
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
26.06.2025, 07:11  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
наследование
Это действительно было наследование, но не в классическом понимании (именно поэтому долго не мог понять фишку)
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Go:
    def go(self: 'Client'):
        print(f"{self.name} go()")
 
 
class Eat:
    def eat(self: 'Client'):
        print(f"{self.name} eat()")
 
 
class Client(Go, Eat):
    def __init__(self):
        self.name = "Вася"
 
 
cl = Client()
cl.go()
cl.eat()
Как мы видим производный наследуется от базового, но аннотация типов идет наоборот - базовый в производный. И ладно если бы такое было где то внутри main - это классика для полиморфизма, но чтобы такое использовать в реализации... Имел дело с несколькими языками на любительском уровне - но такое встречаю впервые. Стоит отметить что данных подход имеет цикличный импорт.

Такой подход помогает как бы "разбить" класс на несколько, используя реализацию в разных файлах. Конкретно в данной библиотеке все эти классы по типу Go, Eat - это запросы на сервер, и каждый из них требует своей реализации. И таких запросов прям очень много, не менее 100. Вероятно такой подход оправдан, чем все эти функции пихать в один класс.

Если есть комменты, идеи и тд - жду
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,667
Записей в блоге: 29
26.06.2025, 10:34
Цитата Сообщение от Enifan Посмотреть сообщение
но аннотация типов идет наоборот
и зачем? традиционно родитель ничего не знает о наследниках, а тут получается он привязан, причем к конкретнному, а с какой целью?

если классу Client нужно только поведение, то можно использовать Protocol а не наследование
0
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
27.06.2025, 10:00
Такая аннотация прямо нарушает принцип инверсии зависимостей из SOLID и крайне не рекомендуется.

Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций.
Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.


Как уже правильно указал Welemir1, лучше протоколы или миксины
0
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
14.07.2025, 22:35  [ТС]
Почитав либу чуть побольше - увидел еще один момент
Python
1
2
3
4
5
6
7
class Eat:
    def __init__(self):
        self.product = "борщ"
        self.color = "красный"
    def eat(self: 'Client'):
        print(f"{self.name} eat()")
        return Eat()
Класс Client не только делает обращение на сервер, но и иногда возвращает текущий объект (если в этом есть смысл). Например для класса Go только отправить данные на сервер, без возврата данных.
Цитата Сообщение от Welemir1 Посмотреть сообщение
а с какой целью?
Я бы сказал что вопрос данного топика. Как я понимаю - автор либы хотел расширить функционал класса, но сделать это в другом файле .py имхо пихать сотни функций по запросу на сервер (а некоторые из них и по 1000 строк кода) в один класс - ну это запутаешься. По сути библиотека писалась с 2017 года и возможно тогда других технологий не было, тут хз
Цитата Сообщение от Welemir1 Посмотреть сообщение
то можно использовать Protocol
Из прочитанного с сайтов - понял что вызовы будут происходить подобным образом
Python
1
eat(client)
а по логике
Python
1
client.eat()
Может я что то не так понял?
Цитата Сообщение от ViachaslauK Посмотреть сообщение
или миксины
Их проблема в том, что они не могут вызвать данные наследника, а это как раз и нужно.

Вообще судя по всему, я бы перефразировал задачу: "Как реализовать функцию класса в другом файле file.py?" Пока что только "неверная реализация" такое может сделать, по крайней мере я не увидел другого способа
0
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
15.07.2025, 08:56
Цитата Сообщение от Enifan Посмотреть сообщение
Почитав либу чуть побольше - увидел еще один момент
Для дальнейшего обсуждения все таки хотелось бы увидеть эту либу, потому что все также кроме непонимания принципов ООП не вижу причин делать такую логику. Никаких сложностей в том, чтобы делать расширение в отдельном файле нет, при этом нет необходимости ломать иерархию. Для примера - по фану пишу счас ИИ-бота, начинался как помощник для собесов(да-да знаю, все кому не лень такое пишут) Потом решил расширить за счет RAG - написал модуль, потом решил потренировать его на форумных ответах и в итоге родился бот для форума, который является расширением модуля RAG, но форум уже использует из RAG, например, создание эмбеддингов. При этом поиск релевантных документов лежит в форуме - он специфичен и нет смфсла его пихать в базовый класс.
Подытоживая, для того, чтобы
Цитата Сообщение от Enifan Посмотреть сообщение
Как реализовать функцию класса в другом файле file.py?
Нет никакой необходимости отступать от принципов СОЛИД
0
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
15.07.2025, 22:11  [ТС]
Цитата Сообщение от ViachaslauK Посмотреть сообщение
хотелось бы увидеть эту либу
Pyrogram.client и например один из методов get_messages
0
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
15.07.2025, 23:01
Цитата Сообщение от Enifan Посмотреть сообщение
Pyrogram.client и например один из методов get_messages
Спасибо. По беглому осмотру - тут попытка бороться с тяжелым легаси. Неудачная декомпозиция того что есть. И скорее всего тут типизирован селф, чтобы просто не забыть, где его использовать.
0
 Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
15.07.2025, 23:04  [ТС]
Цитата Сообщение от ViachaslauK Посмотреть сообщение
попытка бороться с тяжелым легаси
Как бы Вы реализовали подобное?
0
 Аватар для ViachaslauK
126 / 185 / 16
Регистрация: 08.10.2024
Сообщений: 689
16.07.2025, 10:11
Цитата Сообщение от Enifan Посмотреть сообщение
Как бы Вы реализовали подобное?
Я выше приводил пример
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.07.2025, 10:11
Помогаю со студенческими работами здесь

Ошибка: super(Connection, self).__init__(*args, **kwargs2). TypeError: keywords must be strings
Питон версия: 2.7.5 Полный текст ошибки:File...

NameError: name self is not defined
def add_cat(self, row, col): self._cat_list.append((row, col)) Traceback (most recent...

Вывод всех self элементов класса
Добрый день, написал класс для мат вычислений и теперь стоит задача вывести все рассчитанные...

Что такое "self"?
Изучаю PyQt5. Там в каждом примере используется аргумент self. Кто может подсказать что это за...

__init__(self):
Кто может объяснить понятным языком, что такое функция def __init__(self): , для чего она нужна, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru