Операторы и функции [дубликат]

В Java все переменные, которые вы объявляете, на самом деле являются «ссылками» на объекты (или примитивы), а не самими объектами.

При попытке выполнить один метод объекта , ссылка просит живой объект выполнить этот метод. Но если ссылка ссылается на NULL (ничего, нуль, void, nada), то нет способа, которым метод будет выполнен. Тогда runtime сообщит вам об этом, выбросив исключение NullPointerException.

Ваша ссылка «указывает» на нуль, таким образом, «Null -> Pointer».

Объект живет в памяти виртуальной машины пространство и единственный способ доступа к нему - использовать ссылки this. Возьмем этот пример:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

И в другом месте вашего кода:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

Это важно знать - когда больше нет ссылок на объект (в пример выше, когда reference и otherReference оба указывают на null), тогда объект «недоступен». Мы не можем работать с ним, поэтому этот объект готов к сбору мусора, и в какой-то момент VM освободит память, используемую этим объектом, и выделит другую.

2
задан iCodez 8 July 2014 в 20:26
поделиться

3 ответа

Если я правильно понимаю вопрос ...

В двух словах, все это метод объекта. Вы можете найти методы «операторов выражений» в методах магического класса python в операторах .

Итак, почему у python есть такие «сексуальные» вещи, как [x:y], [x], +, -? Потому что это распространено для большинства разработчиков, даже для незнакомых с людьми развития, поэтому математические функции, такие как +, -, поймают человеческий глаз, и он будет знать, что происходит. Подобно индексированию - это распространенный синтаксис на многих языках.

Но нет специальных способов выражения методов upper, replace, strip, поэтому для него нет «операторов выражения» .

Итак, что отличает «операторы выражения» и методы, я бы сказал так, как он выглядит.

1
ответ дан dt0xff 18 August 2018 в 08:45
поделиться

Ваш вопрос довольно широк. Для ваших примеров конкатенация, нарезка и индексация определяются в строках и списках с использованием специального синтаксиса (например, []). Но другие типы могут делать что-то по-другому.

На самом деле поведение большинства (я думаю, все) операторов сконструировано магическими методами , так что действительно, когда вы пишете что-то вроде x + y метод вызывается под капотом.

С практической точки зрения одним из основных отличий является то, что набор доступных синтаксических операторов фиксирован, а новые не могут быть добавлены вашим кодом Python. Вы не можете написать свой собственный код, чтобы определить новый оператор с именем $, а затем работать x $ y. С другой стороны, вы можете определить столько методов, сколько хотите. Это означает, что вы должны тщательно выбирать, какое поведение (если есть) вы назначаете операторам; поскольку существует только ограниченное число операторов, вы хотите быть уверены, что вы не «тратите» их на необычные операции.

2
ответ дан BrenBarn 18 August 2018 в 08:45
поделиться

Есть ли существенная разница между операторами и методами?

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

1 + 2

неявно вызывает int.__add__ , что делает вышеупомянутое выражение равнозначным1:

(1).__add__(2)

Ниже приведена демонстрация:

>>> class Foo:
...     def __add__(self, other):
...         print("Foo.__add__ was called")
...         return other + 10
...
>>> f = Foo()
>>> f + 1
Foo.__add__ was called
11
>>> f.__add__(1)
Foo.__add__ was called
11
>>>

Конечно, фактически использование (1).__add__(2) вместо 1 + 2 было бы неэффективным (и уродливым!), потому что оно связано с ненужным поиском имен с помощью оператора ..

Тем не менее, я не вижу проблемы с общими символами оператора (+, -, * и т. д.) как простые сокращения для связанных им имен методов (__add__, __sub__, __mul__ и т. д.). В конце концов, каждый из них делает то же самое, вызывая тот же метод.


1Well, примерно эквивалент. Как указано здесь , там есть набор специальных методов с префиксом буквы r, которые обрабатывают отраженные операнды. Например, следующее выражение:

A + B

может фактически быть эквивалентно:

B.__radd__(A)

, если A не реализует __add__, но B реализует __radd__.

1
ответ дан iCodez 18 August 2018 в 08:45
поделиться
Другие вопросы по тегам:

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