scorp1ongg
@scorp1ongg

Как понять, к какому элементу мы обращаемся?

У меня есть вопрос на счёт классов

На примере этого кода:
class Duck:
    def __init__(self, color):
        self.color = color
    def saveColor(self, color):
        self.color = color
    def getColor(self):
        return self.color
Utya = Duck("Оранж")
Utya.saveColor("Оранж")
print(Utya.getColor())
print(input())


К примеру, когда мы пишем self.color как понять, к чему точно мы обращаемся

Т.е. как понять, мы обращаемся к аргументу функции, либо к переменной функции, либо к переменной которая за пределами функции или класса, либо к аргументам класса (т.е. к аргументам которые мы указываем при вызове класса)?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
self - это ссылка на экземпляр класса.
self.color это атрибут экземпляра класса.
self.saveColor(self, color) - это метод класса, привязанный к каждому экземпляру класса.

Экземпляры вашего класса Уток обладают свойством - цветом.
Если представить себе класс как таблицу уток, то в этой таблице экземпляры - это строки, и есть колонка «color», это и есть атрибут, у каждой строки своё значение (у каждой утки свой цвет).

Методы класса (self.saveColor(self, color), например) - это его встроенные инструменты, которые позволяют поменять какой-либо атрибут экземпляра или что-то сделать с экземпляром. Вроде как кнопки и регуляторы на пультике управления экземпляром.
Метод - это как функция, только крепко привязанная к экземпляру. У метода могут быть аргументы - self, который должен быть в каждом методе, и color, который не обязан быть в других методах, а только в тех, где это действительно нужно (фактически, только в этом).

self привязывает метод к экземпляру, а color позволяет передать в метод значение снаружи, чтобы внутри метода это значение связать с атрибутом (в данном случае атрибутом self.color) экземпляра.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
shabelski89
@shabelski89
engineer
коротки ответ, как отличить атрибут от метода, проверить его функцией callable (если вызываемый - True, то есть метод , иначе атрибут) пример ниже:
>>> class Duck:
...     def __init__(self, color):
...         self.color = color
...     def get_color(self):
...         return self.color
...
>>>
>>>
>>> d = Duck('orange')
>>> d
<__main__.Duck object at 0x000001F569CDEA08>
>>> dir(d)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'color', 'get_color']
>>> callable(d.color)
False
>>> callable(d.get_color)
True

но скорее всего IDE и так подсвечивает
63ea8c10ab2b5903826805.png

вторая часть проще, нужно прочитать про public, protected, private например тут
и как в примере выше с помощью dir() можно увидеть все атрибуты и методы.
Ответ написан
@igor6130
Ключевое слово self означает, что мы присваиваем значение не глобальной переменной класса, а принадлежащей конкретному объекту, созданному на его основе. В вашем случае - Utya (названия переменных в питоне не должны начинаться с заглавных букв).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы