Python class self this

Смысл this в C++ / self в Python

Верно подмечено, что эти понятия имеют одну и ту же роль в ООП, объектно-ориентированном программировании: это отсылка объекта к самому себе. Она позволяет:

  1. Обращаться к собственным полям (т.е, переменным) и методам;
  2. Передавать объекту самого себя в другие функции и объекты.

Python и C++ отличаются тем, что первая часть в C++ (ещё в Java, C# и Objective-C) реализована автоматически, нам не обязательно постоянно прописывать self или this . Однако это порождает либо путаницу между переменными объекта и локальными, либо постоянное использование нижнего подчёркивания в названии переменных, что, на мой взгляд, не сильно лучше ссылки на объект. Наоборот, в Питоне (и, например, JavaScript’e) необходимо всегда явно указывать, если обращение идёт к полю текущего объекта.

Рассмотрим оба варианта использования.

1) Для обращения к своим полям

Возьмём класс прямоугольник , у него есть две переменные с длинами сторон: a и b , нам нужен метод для вычисления площади – а для этого нужно обращаться из метода к полям объекта. Код на Python:

class Rect: def __init__(self, a, b): # по наличию или отсутствию self различаются # локальные переменные и поля объекта self.a = a self.b = b # self явно присутствует в аргументах методов def area(self): return self.a * self.b 

В языке C++ для этого есть разные способы. Вариант А:

class Rect < private: int a, b; public: Rect(int a, int b) : a(a), b (b) < // такой способ инициализации полей объекта // позволяет избегать путаницы с аргументами >int area() < // также, для обращения к собственным переменным // можно использовать this return this->a * this->b; > > 

Лирическое отступление

Обратите внимание на то, что в методах на Питоне self всегда указывается явно, а в C++ this принимает значение автоматически. И хотя конструкция применяется одна и та же object.method(data) , а в объявлении методов this не используется, на самом деле ссылка на объект присутствует как скрытый первый аргумент. Можно указать объект и явным образом, вот две эквивалентные строки C++ кода:

my_object.push(3); MyClass::push(&my_object, 3); // надеюсь, Вы понимаете C++ значение символов & и * // если нет, спешите скорее разузнать 

Для my_object как экземпляра класса такого вида:

Читайте также:  Shutil python копирование файлов

Кстати, подобным образом явно указать объект можно и в Питоне:

# неявная передача объекта в первый аргумент my_object.push(2) # явное указание объекта как аргумента MyClass.push(my_object, 2) 

2) Для передачи текущего объекта

Например, у нас есть какой-нибудь объект контроллер или контейнер, и объекты нашего класса должны автоматически туда положиться или удалиться из него. Python:

all = [] class MyClass: def __init__(self): all.append(self) 
class MyClass < public: MyClass(); >vector all = new vector(); MyClass::MyClass()

Источник

Difference between Python self and Java this

I had done a bit of Python long back. I am however moving over to Java now. I wanted to know if there were any differences between the Python «self» method and Java «this». I know that «self» is not a keyword while «this» is. And that is pretty much what I could figure out. Am I missing anything else?

You also don’t have to have self (or in Java’s case, this ) as the first parameter of a class method in Java.

4 Answers 4

First of all, let me correct you — self is not a method. Moving further:

Technically both self and this are used for the same thing. They are used to access the variable associated with the current instance. Only difference is, you have to include self explicitly as first parameter to an instance method in Python, whereas this is not the case with Java. Moreover, the name self can be anything. It’s not a keyword, as you already know. you can even change it to this , and it will work fine. But people like to use self , as it has now become a bit of a convention.

Here’s a simple instance method accessing an instance variable in both Python and Java:

class Circle(object): def __init__(self, radius): # declare and initialize an instance variable self.radius = radius # Create object. Notice how you are passing only a single argument. # The object reference is implicitly bound to `self` parameter of `__init__` method circle1 = Circle(5); 
class Circle < private int radius; public Circle(int radius) < this.radius = radius; >> Circle circle1 = new Circle(5); 

If there is an existing python method that doesn’t have self as the 1st parameter because the Author didn’t have a need to access the instance’s attributes and later decides to add it back, does this introduce any backward-incompatibility? I’m assuming no because every Python method is passed the self instance automatically.

Be aware of the difference in case of in inheritance and overriding as mentioned by @林果皞. If you have a parent-child class hierarchy, in Java this in parent refers to parent, but in python self in parent refers to the child.

About self in Python (here is the source: Python self explanation):

The reason you need to use self. is because Python does not use the @ syntax to refer to instance attributes. Python decided to do methods in a way that makes the instance to which the method belongs be passed automatically, but not received automatically: the first parameter of methods is the instance the method is called on. That makes methods entirely the same as functions, and leaves the actual name to use up to you (although self is the convention, and people will generally frown at you when you use something else.) self is not special to the code, it’s just another object.

Python could have done something else to distinguish normal names from attributes — special syntax like Ruby has, or requiring declarations like C++ and Java do, or perhaps something yet more different — but it didn’t. Python’s all for making things explicit, making it obvious what’s what, and although it doesn’t do it entirely everywhere, it does do it for instance attributes. That’s why assigning to an instance attribute needs to know what instance to assign to, and that’s why it needs self..

About this in Java being explained by Oracle (here is the source: Java this explanation):

Within an instance method or a constructor, this is a reference to the current object — the object whose method or constructor is being called. You can refer to any member of the current object from within an instance method or a constructor by using this. The most common reason for using the this keyword is because a field is shadowed by a method or constructor parameter.

Источник

Оцените статью