Разница между самим Python и Java
Я немного поработал с Python. Однако я перехожу к Java. Я хотел знать, существуют ли какие-либо различия между методом "self" Python и Java "this".
Я знаю, что "я" - это не ключевое слово, а "this". И это в значительной степени то, что я мог понять. Я что-то пропустил?
Ответы
Ответ 1
Python self (вот источник: Самообщение Python):
Причина, по которой вам нужно использовать себя. потому что Python не использует синтаксис @для ссылки на атрибуты экземпляра. Python решил сделать методы таким образом, чтобы экземпляр, к которому принадлежит этот метод, передавался автоматически, но не принимался автоматически: первым параметром методов является экземпляр, вызываемый методом. Это делает методы полностью такими же, как функции, и оставляет фактическое имя для использования до вас (хотя сам - это соглашение, и люди обычно будут хмуриться вам, когда вы используете что-то другое.) Я не особо выделяюсь для кода, это просто другой объект.
Python мог бы сделать что-то еще, чтобы отличить нормальные имена от атрибутов - специальный синтаксис, такой как Ruby, или требовать объявления, подобные С++ и Java, или, возможно, что-то еще более разные, но это не так. Python все для того, чтобы сделать вещи явными, делая очевидным, что, и хотя он не делает это целиком повсюду, он делает это, например, атрибуты. Поэтому для назначения атрибуту экземпляра нужно знать, какой экземпляр присваивается, и почему он нуждается в себе.
Java это объяснение Oracle (вот источник: Java это объяснение):
Внутри метода экземпляра или конструктора это ссылка на текущий объект - объект, чей метод или конструктор вызывается. Вы можете обратиться к любому члену текущего объекта из метода экземпляра или конструктора, используя это.
Наиболее распространенной причиной использования этого ключевого слова является то, что поле затеняется параметром метода или конструктора.
Ответ 2
Прежде всего, позвольте мне исправить вас - self
не метод. Двигаемся дальше:
Технически оба значения self
и this
используются для одного и того же. Они используются для доступа к переменной, связанной с текущим экземпляром. Единственное отличие состоит в том, что вы должны включать self
явно как первый параметр в метод экземпляра в Python, тогда как это не относится к Java. Более того, имя self
может быть любым. Это не ключевое слово, как вы уже знаете. вы можете даже изменить его на this
, и он будет работать нормально. Но люди любят использовать self
, так как теперь это стало немного условным.
Вот простой метод экземпляра, который обращается к переменной экземпляра как в Python, так и в Java:
Python:
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);
Java:
class Circle {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
}
Circle circle1 = new Circle(5);
См. также:
Ответ 3
Будьте осторожны, супер может сохранить свою собственную версию this.i в Java, но self.i всегда ссылается на дочерний элемент в Python.
Main.java:
class Parent {
int i;
Parent() {
this.i = 5;
}
void doStuff() {
System.out.println(this.i);
}
}
class Child extends Parent {
int i;
Child() {
this.i = 7;
}
}
class Main {
public static void main(String[] args) {
Child m = new Child();
System.out.println(m.i); //print 7
m.doStuff(); //print 5
}
}
Main.py:
class Parent(object):
i = 5;
def __init__(self):
self.i = 5
def doStuff(self):
print(self.i)
class Child(Parent, object):
def __init__(self):
super(Child, self).__init__()
self.i = 7
class Main():
def main(self):
m = Child()
print(m.i) #print 7
m.doStuff() #print 7
m = Main()
m.main()
Вывод:
$ java Main
7
5
$ python Main.py
7
7
[Обновление]
Причина в том, что объявление Java int i
в классе Child
делает переменную scope i
стать классом класса, в то время как такая переменная затенения в подклассе Python отсутствует. Если вы удалите класс int i
в классе Child
Java, он также напечатает 7 и 7.