NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
См. ссылку S.Lott о декораторах Python для некоторых ярких примеров и посмотрите определять PEP для декораторов .
Python имел AOP с начала, это просто не имело впечатляющего имени. В Python 2.4 был добавлен синтаксис декоратора, который делает применение декораторов очень хорошим синтаксически.
, Возможно, если бы Вы хотите применить декораторов на основе правил, Вам была бы нужна библиотека, но если Вы готовы отметить соответствующие функции/методы, когда Вы объявляете их, Вы, вероятно, не делаете.
Вот пример для простого декоратора кэширования (я записал его для этот вопрос ):
import pickle, functools
def cache(f):
_cache = {}
def wrapper(*args, **kwargs):
key = pickle.dumps((args, kwargs))
if key not in _cache:
_cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache
return _cache[key] # read value from cache
functools.update_wrapper(wrapper, f) # update wrapper's metadata
return wrapper
import time
@cache
def foo(n):
time.sleep(2)
return n*2
foo(10) # first call with parameter 10, sleeps
foo(10) # returns immediately
Я запустил бы с Библиотека Декоратора Python . Большая часть этого является видом AOP материала.
В Python аспектно-ориентированное программирование обычно состоит из динамичного изменения классов и экземпляров во времени выполнения, которое обычно упоминается как monkeypatching. В ответе на другой вопрос о AOP я суммировал некоторые из этих варианты использования для AOP в Python .
Использование аннотаций на самом деле не является АОП, потому что процесс плетения жестко запрограммирован.
В Python есть несколько фреймворков АОП (я насчитал и сравнил 8 из них, из которых Aspyct
был явным победителем).
Я собираюсь опубликовать статью с моими выводами на одной из следующих конференций, включая практический пример использования в отрасли.