Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/21: Рейтинг темы: голосов - 21, средняя оценка - 5.00
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301

ООП. Как создать вложенный метод

24.08.2020, 13:48. Показов 4454. Ответов 11

Студворк — интернет-сервис помощи студентам
Всем, добрый день!

Я только начал юзать ООП. И появился такой интересный вопрос, как сделать и в принципе, как делаются вложенные методы?
Поясню:
Python
1
2
3
4
5
6
7
8
9
class file_opertion(): # Создал какой-нибудь класс
    
    def readfile(self): # Метод (функция, но т.к. она в классе то метод) который считывает данные из некоторого файла
        pass            # Тут какой-нибудь код. Он открывает файл и считывает (непосредственная реализация).
        
        def data_show(self):    # Вот тут и есть вопрос!!! 
                        #Как сделать вложенный метод, что бы я потом мог через ещё одну точку 
                        #обратиться к подметодам "readfile" и вызвать "data_show"
            pass
Т.е. примерно так:
Python
1
2
3
4
a = file_opertion() # Понятно создаю экземпляр класса
 
# И вот что я теперь хочу реализовать:
a.readfile().data_show() # Чтобы через точку, вызвать "подметод", если это так можно сказать
Весь код реализован абсолютно для примера (т.е. это может быть считывание или запись, что угодно, неважно).

Объясните хотя бы одним предложением, что не так. Хоть заумно (пофиг, загуглю, не обломаюсь!), но напишите, пару строк плз...
Спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.08.2020, 13:48
Ответы с готовыми решениями:

ООП: Создать метод, который выдает среднее арифметическое чисел заданных значений
Ребят, помогите пожалуйста. Просьба написать вся программу, потому что не могу пока разобраться в ООП. Создать метод который ...

Как создать вложенный запрос
Доброе утро! Помогите создать запрос в запросе Есть запрос в котором мы получаем некоторые значение по нужным параметрам.К примеру...

Как создать вложенный массив в цикле?
Здравствуйте. Подскажите,пожалуйста решение. Есть массив данных rawData в котором некоторые строки разделены дефисом, эти дефисы нужно...

11
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
24.08.2020, 14:17
Лучший ответ Сообщение было отмечено Schumacher57 как решение

Решение

Цитата Сообщение от Schumacher57 Посмотреть сообщение
a.readfile().data_show() # Чтобы через точку, вызвать "подметод", если это так можно сказать
надо тогда чтобы просто первый метод возвращал объект у которого есть метод дата_шоу

Python
1
2
3
4
5
6
7
>>> class Cat:
...     def meow(self):
...         return 'meow'
...
>>> c=Cat()
>>> c.meow().split()
['meow']
после первой точки у нас вернуло строку, дальше вызываем методы строки
1
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
24.08.2020, 14:46  [ТС]
Цитата Сообщение от Welemir1 Посмотреть сообщение
надо тогда чтобы просто первый метод возвращал объект у которого есть метод дата_шоу
Ага, вон оно что...
Интересно, интересно)) В принципе, могу вернуть свой созданный объект и от него выводить...
Ох как всё непросто... Хотя получилось, для примера

А что если мой readfile возвращает массив? Т.е. более подробненько, с позволения:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
class FileOprt():
data = None  # Данные считваемого файла
 
   def readfile(self):
        pathFile = self.file_path + "\u005c" + self.file_name # Тут просто получаю полный путь
        m = []
        # Да реализовано всё кривовато. Но, суть ниже
        with open(pathFile) as currrentFile:
            for i in range(0, len(currrentFile.readline().split("\t"))):
                m.append([])
        with open(pathFile) as currentFile:
            for line in currentFile:
                for i in range(0, len(m)):
                    m[i].append(float(line.split("\t")[i]))
        self.data = m  # Заносим данные в атрибут dataFile
        
        # Вот, возвращаем считанные данные, как массив
        return m
А я хочу, что если пишу:
Python
1
a.readfile() # Получаю массив
А если пишу:
Python
1
a.readfile().showdata() # То, массив выводится (через print()).
Правильно я понял что надо добавить, класс (скорее всего приватный):
Python
1
2
3
4
5
6
7
8
9
10
class data_show(self, m[]):
    def showdata(self):
        print(self.m)
    pass
 
#т.е. кодом выше, вернуть не массив, а класс datashow:
 
# Вот, возвращаем считанный массив 
# А теперь возвращаем объект datashow
return data_show(m)
Если совсем чего-то напутал, ладно. Пояснения выше, более чем, достаточно. Буду читать матчасть:)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
24.08.2020, 14:57
Цитата Сообщение от Schumacher57 Посмотреть сообщение
скорее всего приватный
ау, ты в питоне, какие приватные классы?

Цитата Сообщение от Schumacher57 Посмотреть сообщение
class data_show(self, m[]):
это что вообще нагорожено? классы называем с Большой буквы, зачем ему наследоваться от m[]?

да можно отнаследоваться от списка и добавить метод шоу_дата, хотя я бы так не стал городить ради одного метода и вызова через точку.
0
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,173
Записей в блоге: 6
24.08.2020, 15:29
Schumacher57, у методов нет методов (кроме служебных). Методы есть у классов.
Вложеные методы могут хорошо сыграть, но не для того, что вы вот тут хотите.
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
24.08.2020, 23:33
Schumacher57, Не слышал, что бы в структуре питона существовали вложенные методы. Метод , это атрибут экземпляра класса. Не слышал, что бы атрибуты могли иметь свои атрибуты. То о чем говорит Welemir1, это атрибуты объектов возвращаемых методами. То есть атрибут, являющийся методом вернул объект строку, а строка имеет свои атрибуты, которые можно использовать. Но это не атрибуты метода, который возвращает строку.
Что бы в пределах одного класса работала запись
a.readfile().showdata()
нужно, что бы readfile() и showdata() были методами этого класса и readfile() возвращал self , то есть экземпляр этого класса. Или showdata() должен быть методом другого класса "B" , и метод readfile() должен возвращать экземпляр класса "В". Именно этот вариант использован в примере, который дал Welemir1, со строкой, имеющей метод split() .
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
24.08.2020, 23:46
Цитата Сообщение от Viktorrus Посмотреть сообщение
Не слышал, что бы в структуре питона существовали вложенные методы
ТС, думаю просто слышал звон, да не знает где он.
А звон был про декораторы и замыкания, которые могут быть как функциями, так и методами.
Но к его хотелкам они отношения не имеют.
0
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
25.08.2020, 06:16  [ТС]
Ого... сколько сообщений.
Начну с благодарности:
Спасибо за помощь, ребят! Правда!

И по порядку...:

Welemir1,
Цитата Сообщение от Welemir1 Посмотреть сообщение
ау, ты в питоне, какие приватные классы?
Ну, тут признаюсь писал словно обезьяна с гранатой, на обум. Хотя какие-то флешбеки были из декораторов в python (по-моему в какой-то книге видел, что так можно сделать с классом, с помощью них, а тут ещё и C# в голову ударил и короче всё смешалось).
Цитата Сообщение от Welemir1 Посмотреть сообщение
классы называем с Большой буквы, зачем ему наследоваться от m[]?
Тут как бы, я просто хотел сразу в экземпляр класса передать, аргумент... А не унаследоваться... Хотя вот, щас понимаю, что как-то оно не то(
Цитата Сообщение от Welemir1 Посмотреть сообщение
да можно отнаследоваться от списка и добавить метод шоу_дата, хотя я бы так не стал городить ради одного метода и вызова через точку
Я тут ради примера всё затеял. Я вот, что в C#, что в VBA (там тоже какие никакие, но классы есть), всё давняя тема, не могу врубить... Вот у класса функция это метод. Т.е. ты создал, класс, создал у класса функцию она же метод (так во всех языках). Тут у меня в голове всё, чётко по полочкам лежит. Но, вот никак врубить не могу. Вот когда ты у класса (я уже говорю, не конкретно про свой, но для примера), вызвал метод (a.readfile - напр.), а потом тебе intellisense предлагает ещё один метод... Это вот как? readfile это же метод (функция), класса "а" (a.readfile), как у этой функции может быть ещё подметод... или что это вообще, тогда?

Дальше:

dondublon,
Цитата Сообщение от dondublon Посмотреть сообщение
у методов нет методов (кроме служебных). Методы есть у классов.
Вложеные методы могут хорошо сыграть, но не для того, что вы вот тут хотите.
Ну тут, на самом деле перекрывает, ответ Welemir1. Вот, как раз, про: методы есть у классов (это супер, ясно как день). А когда, я у класса вызываю метод, а он мне предлагает ещё один метод (вложенный), это к сожалению, пока для меня магия, в которую вот уже, сколько времени, не могу въехать, начиная с VBA, С# и вот до python добрался(он по-моему проще всех, язык)?

Next:

Viktorrus,
Цитата Сообщение от Viktorrus Посмотреть сообщение
То о чем говорит Welemir1, это атрибуты объектов возвращаемых методами. То есть атрибут, являющийся методом вернул объект строку, а строка имеет свои атрибуты, которые можно использовать.
Вот на самом, деле да. Сейчас, вот прочёл и увидел проблески (суши на горизонте). Что получается:
Экземпляр класса - это объект. И вот, что бы я имел возможность (скажу по китайски, сорян) вызвать подметод(2) у метода(1) класса(а), нужно что бы метод (1) класса (а) возвратил, экземпляр другого класса (b - абсолютно другой класс). И тогда, эта вся магия заработает?
Тут позволю спросить (хотя конечно скорее всего, пока рановато, а может уже стоит пробовать эту вершину) это (то что я спрашиваю) называется полиморфизмом?

И Last

Garry Galler,
Цитата Сообщение от Garry Galler Посмотреть сообщение
А звон был про декораторы и замыкания, которые могут быть как функциями, так и методами.
Но к его хотелкам они отношения не имеют.
Тут согласен, мне наверно пока не стоит эти штуки трогать. Разве что спрошу, я выше писал, что с помощью декораторов, вроде как можно создать приватный метод или класс. Это верно (хоть от части)?

Не по теме:

Ещё раз, всем спасибо большущее за ответы!)



Добавлено через 14 минут
Вот на самом, деле да. Сейчас, вот прочёл и увидел проблески (суши на горизонте). Что получается:
Экземпляр класса - это объект. И вот, что бы я имел возможность (скажу по китайски, сорян) вызвать подметод(2) у метода(1) класса(а), нужно что бы метод (1) класса (а) возвратил, экземпляр другого класса (b - абсолютно другой класс). И тогда, эта вся магия заработает?
В общем, это самый главный вопрос.
0
1303 / 843 / 409
Регистрация: 12.03.2018
Сообщений: 2,305
25.08.2020, 08:18
Цитата Сообщение от Schumacher57 Посмотреть сообщение
приватный метод или класс
Нет в python приватных методов.
Есть соглашения, что если что-то должно использоваться только внутри класса, то его название (атрибута) начинается с символа "_". Это protected атрибут.
Чтобы получить приватный атрибут, добавляют "__". Это даже не позволит вам напрямую обратиться к данному атрибуту (т.к. его имя будет изменено), но это можно обойти.
0
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,173
Записей в блоге: 6
25.08.2020, 09:48
Цитата Сообщение от Schumacher57 Посмотреть сообщение
А когда, я у класса вызываю метод, а он мне предлагает ещё один метод (вложенный), это к сожалению, пока для меня магия,
Кто этот загадочный "он", который предлагает вам всякие непотребства?

Ещё раз - ну нет у методов - методов, кроме служебных.
0
18 / 17 / 3
Регистрация: 07.09.2015
Сообщений: 301
25.08.2020, 11:06  [ТС]
dondublon,
Цитата Сообщение от dondublon Посмотреть сообщение
Кто этот загадочный "он"
IDE с IntelliSense
Цитата Сообщение от dondublon Посмотреть сообщение
Ещё раз - ну нет у методов - методов, кроме служебных.
Ну, ясно. Ладно, я понимаю, что либо сложно объяснить (в буквальном смысле), что я спрашиваю, либо сложно спросить, что конкретно я хочу услышать.

Но, в итоге думаю, я благодаря вашим ответам, понял, где "собака зарыта".

Не по теме:

Вы дали компас, а с картой (с островом и крестиком) я разберусь. Дали удочку, а не рыбу. Показали лес, за деревьями. Увидел ещё что-то кроме фиги в книге... Ладно, хватит с аллегориями....:))



Ещё раз, всем огромное спасибо!
0
Эксперт Python
 Аватар для dondublon
4649 / 2069 / 366
Регистрация: 17.03.2012
Сообщений: 10,173
Записей в блоге: 6
25.08.2020, 11:12
Цитата Сообщение от Schumacher57 Посмотреть сообщение
IDE с IntelliSense
Я проверил в pycharm - ничего такого нет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2020, 11:12
Помогаю со студенческими работами здесь

Как создать вложенный динамический массив объектов?
Собственно, нужно создать массив объектов, внутри которого, в том числе, есть массив объектов(минимум 1 элемент в массиве), внутри которых...

Как вывести несколько полей в выпадающий список, или как создать вложенный запрос на добавление?
Всем Привет. Сразу Приношу извинения за нубство:), пытаюсь разобраться сам(самоучка) В общем есть 2 таблицы:...

Как правильно создать типизированный вложенный класс через дженерики?
Допустим у меня есть класс Graph, внутри которого есть два класса Vertex и Edge. Мне необходимо сделать класс Vertex типизированным, чтобы...

Как создать вложенный класс с возможностью изменять значения основного класса?
Доброго времени суток! Помогите советом, так как последнее время, до меня что-то тяжело всё доходит( Пишу для себя игру, в свободное...

Метод и вложенный объект
Только начал изучать JavaScript. Для начала приведу код, по которому сложились непонятки: <script> function Car(ven, mod,...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru