2013-03-11 10 views
28

Czy dekoratory Python są takie same lub podobne, czy zasadniczo różne od adnotacji Java lub czegoś w stylu Spring AOP lub Aspect J?Czy program Python Decorator jest taki sam jak adnotacja Java lub Java z aspektami?

+0

Python ma również adnotacje, więc zakładam, że są zasadniczo różne. – mgilson

+0

możliwy duplikat ["@" Decorator (w języku Python)] (http://stackoverflow.com/questions/10191561/decorator-in-python) –

+0

Zobacz zmiany, aby rozwinąć pytanie do aspektów Java. –

Odpowiedz

33

Python dekoratorów są cukier tylko syntaktyczny dla przekazując funkcję do innej funkcji i zastąpienie pierwszej funkcji z wynikiem:

@decorator 
def function(): 
    pass 

jest cukier syntaktyczny dla

def function(): 
    pass 
function = decorator(function) 

adnotacji Java same tylko magazynu metadane, musisz mieć coś, co sprawdza je, aby dodać zachowanie.

 

systemy Java AOP są ogromne rzeczy zbudowane na szczycie Java, dekoratorzy są tylko składnia języka z niewiele ma semantyki dołączonych, naprawdę nie można porównać je.

1

zrzeczenie - Nie znam żadnego Java


Z iż z drogi, mam zamiar założyć, że adnotacja Java jest jak adnotacji Pythona wprowadzonego z PEP 3107. Adnotacje to sposoby dołączania meta-danych do samego obiektu funkcji.

Dekoratory (od PEP 0318) są zwykle do tworzenia nowych funkcji (chociaż przypuszczam, że dekorator mógł zwrócić również swoją dawną funkcję). Te nowe funkcje zwykle owijają się wokół funkcji wejściowej, ale mogą wykonać dowolną wartość. Oto głupi przykład, gdzie zawsze przechodzą 'foo' jako drugi argument:

def second_always_foo(func): 
    def wrapper(*args,**kwargs): 
     args = list(args) 
     args[1] = 'foo' 
     return func(*args,**kwargs) 
    return wrapper 

@second_always_foo 
def printer(arg1,arg2): 
    print arg1,arg2 

printer("Hello","world") 

Zauważ, że ten przykład mógł zostać napisany bez dekoratora jak:

... 
def printer(arg1,arg2): 
    print arg1,arg2 

printer = second_always_foo(printer) 
+0

Nie jestem też ekspertem od Javy, ale adnotacje AFAIK dotyczą znacznie więcej niż tylko funkcji/metod (klasy, parametry i więcej). – delnan

+0

@delnan - który byłby inny sposób, że różnią się od dekoratorów Pythona. podczas gdy python ma dekoratory klas, nie ma niczego takiego jak dekoratory parametrów (lub nawet adnotacje parametrów AFAIK) ... – mgilson

+0

Python 3 ma adnotacje parametrów (ale bez adnotacji w klasie). –

1

używam obu z nich w sposób w podobny sposób: włączanie/wyłączanie opcji debugowania lub testowania.

(na przykład dekoratorów Python):

def measure_time(func): 
    def _measure_time(*args, **kwargs): 
     t0 = time.time() 
     ret = func(*args, **kwargs) 
     print "time=%lf" % (time.time()-t0) 
     ... 
     return ret 
    return _measure_time 


@measure_time 
def train_model(self): 
    ... 

adnotacji Java, użyj getAnnotation, etc. może wykonać podobne oferty lub bardziej skomplikowanych.

Powiązane problemy