Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
2 / 2 / 2
Регистрация: 16.08.2017
Сообщений: 72
1

Почему при вызове метода у экземпляра класса он сначала ищет у экземпляра

28.11.2017, 20:12. Показов 1094. Ответов 5
Метки нет (Все метки)

Всем привет, после прочтения Лутца про ООП появился такой вопрос почему при вызове метода у экземпляра класса он сначала ищет у экземпляра, а потом идет выше по дереву, у экземпляров же не может быть методов, только собственные атрибуты. Почему же тогда сразу не перейти к классу(подклассу) выше (по дереву). Но вроде бы ответ скрывается в том, что когда мы обращаемся к методу или атрибуту , класса или экземпляра, не важно, Мы делаем это через точку. То соответсвенно Python не знает что это именно ,метод или атрибут. Так почему же в Python не реализовали обращение к атрибуту экземпляра через self.method(). Self реализован только в классе, а вне класса мы обращаемся ко всем через точку. Так же проще будет или нет?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.11.2017, 20:12
Ответы с готовыми решениями:

При создании экземпляра класса, создается 2 экземпляра вместо 1
Подсчет экземпляров ведется с помощью статического члена num_dogs, который во всех трех...

Создание нового экземпляра дочернего класса из экземпляра базового
Всем привет! Извиняюсь, если вопрос глупый, но что-то не смог найти конкретный ответ на него... ...

Сложение экземпляра базового класса и экземпляра наследника
Добрый вечер! Моя задача - сложить экземпляр базового класса и наследника. Нужно сделать так, чтобы...

Создать экземпляр метода класса или доступ к методу из экземпляра класса
Всем доброго времени суток!) Уже месяца как 2 не сишарпил и подзабыл...собственно задача такая:...

5
3250 / 2052 / 351
Регистрация: 24.11.2012
Сообщений: 4,903
28.11.2017, 20:29 2
Цитата Сообщение от Helsereet Посмотреть сообщение
при вызове метода у экземпляра класса он сначала ищет у экземпляра, а потом идет выше по дереву
Сначала поиск метода выполняется в классе, экземпляром которого является объект. Затем, если метод не найден, у предков в соответствии с method resolution order.

Дальнейший поток мыслей относительно self мне непонятен. Постарайся переформулировать более последовательно, возможно даже с примерами кода.
0
Эксперт Python
5177 / 3698 / 1174
Регистрация: 28.10.2013
Сообщений: 9,289
Записей в блоге: 1
28.11.2017, 21:19 3
Цитата Сообщение от Helsereet Посмотреть сообщение
у экземпляров же не может быть методов
Может. Метод может быть как экземплярным, так и классовым. Большинство методов - экземплярные. Те же, которые объявлены с декоратором @classmethod - классовые.
0
2 / 2 / 2
Регистрация: 16.08.2017
Сообщений: 72
29.11.2017, 20:28  [ТС] 4
Ну вы неправы, поиск в любом случае начинается с экземпляра класса, а потом уже идет к самому классу. Потому что мы обращаемся к методу/атрибуту экземпляра через точку, но интерпретатор же не знает что это именно, метод класса или атрибут экземпляра. Вот и поиск ведется всегда экземпляр, я же предлагал сделать чтобы мы обращались к атрибуту экземляра, вне класса так же через self, как обращаемся в классе, а к методу класса через точку пример:
Python
1
2
3
4
5
6
7
8
9
10
11
12
class SomeOne:
    def __init__(self, name):
        self.val = name
 
 
    def print_name(self):
        print(self.val)
 
first = SomeOne('Bob') # создаем экземпляр
first.print_name()  # Важно заметить что поиск метода начинается с экземпляра, но метод найдет только, дойдя до класса
print(first.val)       #  Тут также поиск начинается с экземпляра, но уже ищем не метод, а атрибут, и поиск закончится на данном экземпляре
print(first.self.val)  # в предыдущих примерах мы что к методу, что к атрибуту экземпляра обращались через точку. Я предлагаю же делать обращение через точку только к методу класса, а к атрибуту экземпляра, обращаться через self как в данном примере. Тем самым поиск будет сразу начинаться в нужном месте. P.S я вообще думаю что без self было проще, но если их решили ввести то этот вариант был бы уместен. Как говорится в дзене python - явное лучше не явного-
0
Эксперт Python
5177 / 3698 / 1174
Регистрация: 28.10.2013
Сообщений: 9,289
Записей в блоге: 1
29.11.2017, 20:56 5
Цитата Сообщение от Helsereet Посмотреть сообщение
поиск в любом случае начинается с экземпляра класса
Потому что есть bound методы - привязанные к self и unbound - не привязанные к self: classmethod, например.

Цитата Сообщение от Helsereet Посмотреть сообщение
я вообще думаю что без self было проще
Тогда нельзя было бы создавать методы класса вне определения класса. А так - запросто.

Цитата Сообщение от Helsereet Посмотреть сообщение
Тем самым поиск будет сразу начинаться в нужном месте.
Почему вас так это волнует? У каждого класса есть свой словарь методов\атрибутов (а у экземпляра класса - свой словарь). Поиск объектов по ключу выполняется за константное время O(1).
Если не нашли у себя - поиск по иерархии наследования вверх в соответствии с MRO.
0
2 / 2 / 2
Регистрация: 16.08.2017
Сообщений: 72
29.11.2017, 21:57  [ТС] 6
А можете привести пример определения экземпляра класса нового метода? Именно метода, не атрибута. Может я просто еще до этого не дошел
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.11.2017, 21:57

Повторное выполнение метода экземпляра класса
Повторение метода экземпляра класса Есть класс, нужно чтобы имя экземпляра выводилось в DOM с...

Вызов метода класса без создания экземпляра класса.
В общем мне для функционирования одной программы нужно постоянно вызывать метод одного из классов....

Создание экземпляра класса, разрушение экземпляра класса
Не могу найти информацию про разрущение экземпляра класса. Объясните пожалуйста, что это?

При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
Добрый день. Есть несколько вопросов про событий и делегаты: 1) При сравнении экземпляра делегата...

Что означает первый параметр метода этого класса? И почему при вызове метода передаётся один параметр(второй)?
public static HelpPageApiModel GetHelpPageApiModel(this HttpConfiguration config, string...

Как при создании экземпляра класса инициализировать переменные вложенного класса
Здравствуйте. Подскажите пожалуйста как при создании екземпляра класа инициализировать переменные...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru