Czy dekorator Pythona jest taki sam jak adnotacja w Javie, czy też Java z aspektami?

Czy dekoratory Pythona są takie same lub podobne, lub zasadniczo różnią się od adnotacji w Javie lub czegoś takiego jak Spring AOP, czy Aspect J?

Author: Mangu Singh Rajpurohit, 2013-03-11

4 answers

Dekoratory Pythona są tylko cukrem składniowym do przekazywania funkcji do innej funkcji i zastąpienia pierwszej funkcji wynikiem:

@decorator
def function():
    pass

Jest cukrem składniowym dla

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

Adnotacje Javy same w sobie przechowują metadane, musisz mieć coś, co je sprawdza, aby dodać zachowanie.

 

Java systemy AOP to ogromne rzeczy zbudowane na bazie Javy, dekoratory to tylko składnia języka z niewielką ilością semantyki, naprawdę nie można porównać oni.

 60
Author: Pavel Anossov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-11 19:55:54

Jest to bardzo ważne pytanie, które każdy, kto gra w obu tych językach jednocześnie, może uzyskać. Sam spędziłem trochę czasu na Pythonie, a ostatnio byłem na bieżąco z Javą i oto moje podejście do tego porównania.

Adnotacje Javy to-po prostu: adnotacje. Są to znaczniki; kontenery dodatkowych metadanych o podstawowym obiekcie, który znakują/adnotują. Ich sama obecność nie zmienia przebiegu wykonania bazowego, ani nie dodaje hermetyzacja / owijka jakiegoś rodzaju na wierzchu. Jak oni pomagają? Są one odczytywane i przetwarzane przez procesory adnotacji. Metadane, które zawierają, mogą być używane przez niestandardowe procesory adnotacji, aby dodać dodatkową funkcjonalność, która ułatwia życie; ale, i znowu, nie zmieniają one przepływu wykonania bazowego, ani nie owijają ich wokół.

Nacisk na "nie zmienianie przepływu wykonania" będzie jasny dla kogoś, kto używał dekoratorów Pythona. Python decorators, chociaż są podobne do adnotacji Java w wyglądzie i odczuciu, są zupełnie inne pod maską. Biorą podłoże i owijają się wokół niego w dowolny sposób, zgodnie z życzeniem użytkownika, być może nawet całkowicie unikając uruchamiania samego podłoża, jeśli ktoś zdecyduje się to zrobić. Biorą podłoże, owijają się wokół niego i zastępują podłoże owiniętymi. Skutecznie "proxyują" podstawy!

Teraz to jest dość podobne do tego, jak Aspekty pracy w Javie! Aspekty same w sobie są dość rozwinięte pod względem mechanizmu i elastyczności. Ale w zasadzie to, co robią, to - weź metodę "doradzaną" (mówię o nomenklaturze AOP wiosną, i nie wiem, czy dotyczy to również AspectJ), zawijaj funkcjonalność wokół nich, wraz z predykatami i podobnymi, i "proxy" metodę "doradzaną" z owijanym.

Proszę zauważyć, że te rozważania są na bardzo abstrakcyjnym i pojęciowym poziomie, aby pomóc uzyskać szerszy obraz. As you zacznij zagłębiać się głębiej, wszystkie te pojęcia-dekoratorzy, adnotacje, aspekty-mają dość angażujący zakres. Ale na poziomie abstrakcyjnym są one bardzo porównywalne.

TLDR

Pod względem wyglądu i stylu, dekoratory Pythona można uznać za podobne do adnotacji Javy, ale pod maską działają bardzo bardzo podobnie do sposobu, w jaki aspekty działają w Javie.

 22
Author: Shreyas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-24 09:09:20

Używam obu w podobny sposób: aby włączyć / wyłączyć opcje debugowania lub testowania.

Na przykład (Python decorators):

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):
    ...

Dla adnotacji Java, użyj getAnnotation, itp.Może wykonywać podobne lub bardziej skomplikowane zadania.

 2
Author: 鄭大大,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-22 06:00:03

Dekoratory Pythona i adnotacje Javy mają tę samą składnię, ale do dwóch bardzo różnych celów! Nie są kompatybilne ani wymienne w żaden sposób!

W niedawnym projekcie miałem konieczność użycia semantyki adnotacji Javy na skrypcie Pythona i szukałem sposobu, aby go emulować i znalazłem to:

W Pythonie istnieje funkcjonalność o nazwie 'Docstring'!

To nic innego jak specjalna linia komentarza, która musi być pierwszą linią w module, class albo funkcja!

Podobnie jak wiersz komentarza, możesz użyć dowolnej formy tekstu. Ale to, co czyni go tak wyjątkowym dla mnie w tym przypadku, to to, że jest czytelny przez instrospection Pythona!!

Więc może działać jak Adnotacja w Javie, która również potrzebuje odbicia Javy, aby zinterpretować i zareagować na metadane z niej przenoszone!!

Wykonaj krótki przykład:

Źródło a.py

```
def some_function():
    '''@myJavaLikeAnnotation()'''
    ... (my function code) ...
```

Źródło b.py (gdzie muszę przetworzyć @myJavaLikeAnnotacion ()):

import a

for element_name in dir(a):
    element = getattr(a, element_name)
    if hasattr(element, '__call__'):
        if not inspect.isbuiltin(element):
            try:
                doc = str(element.__doc__)
                if not doc == '@myJavaLikeAnnotation()':
                    # It don't have the 'java like annotation'!
                    break

                ... It have! Do what you have to do...  
            except:
                pass

Oczywiście, że wadą jest to, że musisz samodzielnie przeanalizować wszystkie metadane, których używasz w swoim "Python java like adnotations"!

 0
Author: Júlio Oliveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-09-02 16:16:30