Автор оригинала: Pankaj Kumar.
Понимание переменной self в Python с примерами
Python Self переменная используется для связывания экземпляра класса к методу экземпляра. Мы должны явно объявлять его как первый аргумент метода для доступа к переменным и методам экземпляра. Эта переменная используется только с методами экземпляра.
В большинстве объектно-ориентированных языков программирования вы можете получить доступ к текущему объекту в методе без необходимости явно иметь его в качестве параметра метода. Например, мы можем использовать ключевое слово « это » для доступа к текущему объекту в программе Java. Но в Python мы должны явно объявлять экземпляр объекта как «самостоятельно» переменной.
Python Self – это ключевое слово?
Python Self Cariable не является зарезервированным ключевым словом. Но это лучшая практика и конвенция для использования имени переменной как «я» для обозначения экземпляра.
Пример self переменной Python
Скажем, у нас есть класс собаки, определенный как ниже.
class Dog: def __init__(self, breed): self.breed = breed def bark(self): print(f'{self.breed} is barking.') d = Dog('Labrador') d.bark()
Выход : Лабрадор лает.
- Функция __init __ () определяется двумя переменными, но когда мы создаем экземпляр собак, мы должны предоставить только один аргумент. «Self» автоматически назначается на вновь созданный экземпляр класса собака.
- Метод CARE () имеет только один аргумент – «Self», который получает связывание с экземпляром собаки, которая вызывает этот метод. Вот почему мы не передаем никаких аргументов при вызове метода коры ().
- Если мы должны получить доступ к любой переменную экземпляра в функции, мы можем использовать оператор DOT.
Можем ли мы пропустить переменную «Self»?
Что, если метод экземпляра не должен получить доступ к переменным экземпляра. Можем ли мы пропустить самостоятельную переменную в этом случае?
Давайте узнаем простым примером.
class Dog: def bark(): print('Barking') d = Dog() print("Done")
Если вы запустите вышеуказанный код, не будет никакой ошибки. Но мы не называем методом коры (). Давайте посмотрим, что произойдет, когда мы пытаемся позвонить в метод коры ().
d = Dog() d.bark()
Мы получаем ошибку как метод коры () принимает 0 аргумент, но мы предоставили 1. Это потому, что когда мы звоним D.BARK ()
, экземпляр «D» автоматически передается как первый аргумент метода экземпляра коры ().
Но, если мы получим доступ к методу экземпляра коры () через ссылку на класс, то она будет работать нормально. Итак, позвонив Dog.bark () не приведет к ошибкам.
Подобные переменные для метода класса и статический метод?
Такое же поведение присутствует с классовыми методами тоже. Единственное отличие состоит в том, что Конвенция состоит в том, чтобы использовать « CLS » как имя переменной для ссылки на класс.
class Dog: @classmethod def walk(cls): print('Dog is Walking') Dog.walk()
Однако он не требуется со статическим методом. Поскольку статические методы являются самодостаточными функциями, и они не могут получить доступ к любым из переменных классов или функций напрямую.
Давайте посмотрим на полный пример с Я и CLS Переменные и статический метод без каких-либо аргументов.
class Dog: def __init__(self, breed): self.breed = breed @classmethod def walk(cls): print('Dog is Walking') # instance method def bark(self): print(f'{self.breed} is barking.') @staticmethod def add(x, y): return x + y Dog.walk() d = Dog('Labrador') d.bark() print(Dog.add(10, 20))
Выход:
Dog is Walking Labrador is barking. 30
Быстрый пример, чтобы сломать конвенцию
Этот пример просто показать вам, что не обязательно использовать имя переменной как «Self» и «CLS». В реальном программировании всегда придерживайтесь этой конвенции.
class Dog: @classmethod def walk(myclass): print('Dog is Walking') # instance method def bark(myobject): print('Dog is Barking.') Dog.walk() d = Dog() d.bark()
Переменная «Self» связана с текущим экземпляром
Самоременная дает нам доступ к свойствам текущего экземпляра. Мы можем подтвердить это простым примером, создавая два разных экземпляра класса собачьи.
class Dog: def __init__(self, b): self.breed = b def bark(self): print(f'{self.breed} is Barking.') d1 = Dog('Labrador') d2 = Dog('Husky') d1.bark() d2.bark()
Выход:
Labrador is Barking. Husky is Barking.
Почему бы не сделать «я» переменную неявную?
Было много предложений, чтобы сделать «самостоятельно» переменную зарезервированное ключевое слово и неявно доступна для метода экземпляра. Но предложение было отклонено «Гвидо Ван Россомом». Вы можете прочитать о них здесь и здесь Отказ