Подтвердить что ты не робот

Разница между самим Python и Java

Я немного поработал с Python. Однако я перехожу к Java. Я хотел знать, существуют ли какие-либо различия между методом "self" Python и Java "this".

Я знаю, что "я" - это не ключевое слово, а "this". И это в значительной степени то, что я мог понять. Я что-то пропустил?

4b9b3361

Ответ 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.