Аватар для Enifan
1848 / 1190 / 501
Регистрация: 14.10.2018
Сообщений: 3,211

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

25.06.2025, 04:12. Показов 1501. Ответов 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
Сообщений: 309
25.06.2025, 05:24
почему во втором классе нет инициализатора?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru