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

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

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

Всем привет, после прочтения Лутца про ООП появился такой вопрос почему при вызове метода у экземпляра класса он сначала ищет у экземпляра, а потом идет выше по дереву, у экземпляров же не может быть методов, только собственные атрибуты. Почему же тогда сразу не перейти к классу(подклассу) выше (по дереву). Но вроде бы ответ скрывается в том, что когда мы обращаемся к методу или атрибуту , класса или экземпляра, не важно, Мы делаем это через точку. То соответсвенно Python не знает что это именно ,метод или атрибут. Так почему же в Python не реализовали обращение к атрибуту экземпляра через self.method(). Self реализован только в классе, а вне класса мы обращаемся ко всем через точку. Так же проще будет или нет?

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2017, 20:12
Ответы с готовыми решениями:

Удаление экземпляра класса
Экземпляры класса хранятся в коллекции Collection = Как экземпляру уничтожить себя, и как это...

Атрибуты класса и экземпляра
здравствуйте, помогите разобраться Имеем класс А и два экземпляра класса: а и b У класса А есть...

Пропавший атрибут self у экземпляра класса
Управляющая программа: #! usr/bin/env/python3 import shelve as crt import alfalist as alf...

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

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

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

Дальнейший поток мыслей относительно self мне непонятен. Постарайся переформулировать более последовательно, возможно даже с примерами кода.
0
Garry Galler
2122 / 1601 / 617
Регистрация: 28.10.2013
Сообщений: 4,118
28.11.2017, 21:19 3
Цитата Сообщение от Helsereet Посмотреть сообщение
у экземпляров же не может быть методов
Может. Метод может быть как экземплярным, так и классовым. Большинство методов - экземплярные. Те же, которые объявлены с декоратором @classmethod - классовые.
0
Helsereet
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
Garry Galler
2122 / 1601 / 617
Регистрация: 28.10.2013
Сообщений: 4,118
29.11.2017, 20:56 5
Цитата Сообщение от Helsereet Посмотреть сообщение
поиск в любом случае начинается с экземпляра класса
Потому что есть bound методы - привязанные к self и unbound - не привязанные к self: classmethod, например.

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

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

Удалить перевод строки в начале экземпляра класса
Привет всем! items.py: import scrapy from scrapy.loader.processors import MapCompose def...

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru