Dekorator jest szablonem zaprojektowanym do łączenia dodatkowego zachowania z obiektem. Używany w wielu językach OOP: Java, C #, PHP, JS. Python nie jest wyjątkiem. Zadanie dekoratorów można opisać w poniższym przykładzie. Istnieje obiekt, który pełni jakąś funkcję, podczas tworzenia programu musisz dodać do niego dodatkową funkcjonalność. Można go wykonać przed lub po, a nawet podczas głównych funkcji. Do rozwiązania tego problemu służą dekoratory. Rozszerzają funkcjonalność, eliminując tworzenie drugiej z tej samej klasy za pomocą dodatkowych metod. Dekoratory Python są rodzajem opakowania, które zmienia zachowanie funkcji. Jako zmieniony obiekt używana jest klasa, funkcja lub inny dekorator. Powinny być stosowane bardzo ostrożnie i jasno rozumieć, co dokładnie należy osiągnąć. Zbyt częste używanie dekoratorów prowadzi do komplikacji w zrozumieniu kodu.
Dekorator i funkcja
def empty_func ()
przechodzi
W podobny składni dotyczy wszystkich funkcji oprócz anonimowy. Anonymous jest w następujący sposób:
func = N x, y: x + y
,
połączeń:
func (1 2) # powraca 3
,
połączenia (druga metoda)
(N x, y: x + y) (1 2) # powraca 3
, [21 ], dekoratorzy spowodowane w następujący sposób:
Nazwa @ dekorator
,
def yzmenyaemaya_funktsyya
yzmenyaemoy_funktsyy korpusdziała schemat opisany następującym kodem
def dekorator (change_funct):
def return_func1 ()
drukującego "kod przed"
change_funct ()
druku "kod po"
powrotny return_func1w związku z tym połączenie jest w następujący sposób:
,Związek pośredni scenariusz asynchroniczny = „//pagead2.googlesyndication.com/pagead/js/a dsbygoogle.js "& gt;
& lt ;! - fb_336x280_2 - & gt;
& lt; skrypt & gt; (adsbygoogle = window.adsbygoogle || []). push ({});@decorator
,
def retrurn_func1 ()
druku new_changeargumenty
argumentów przekazywanych Pythona dekoratorzy dowolny typ dane.
Zmienne tego samego typu są tłumaczone za pomocą przecinków. Istnieje kilka sposobów określania wartości zmiennych w parametrach.
- Normalny.
- Za pomocą słów kluczowych.
- Zadania wartości statycznych.
- Wykorzystanie elementów pozycyjnych.
Podczas tworzenia kilka argumentów jest określanych w określonej kolejności. Podczas wywoływania parametrów wszystkie wartości są określone ww odpowiedniej kolejności.
def większy (a, b):
,
jeśli & gt; B:
nadrukowanie
else:
druku BPoprawne wyzwanie,
(66 ) Błędne połączenie:większy
,
większe
,
większe (1273)Jeżeli argumenty są wyszukiwane z wezwania losowo stosowane wartość określa konkretny klucz nazwy.
def osoba (imię i nazwisko, wiek):
Nazwa print "jest", "wiek", "wiek"
osoba (wiek = 23 name = "Jan")Statyczne wartości zmiennych są tworzone wraz z funkcją przez operatora przypisania tak, jakby inicjalizacja odbywała się w ciele.
& lt; script type = "text /javascript" & gt;
zmienna blockSettings2 = {blockID "R-A-70350-39" renderTo "yandex_rtb_R-A-70350-39" asynchroniczny :! 0};
if (document.cookie.indexOf ("abmatch =") & gt; = 0) blockSettings2.statId = 70350;
! Zastosowanie (a, b, c, d, e) {A [c] = A [c] || [] A [c] .Push (funkcja () {Ya.Context.AdvManager.render (blockSettings2)}), e = b.getElementsByTagName ("scenariusz")d = b.createElement ("scenariusz") d.type = "text /JavaScript" d.src = „//an.yandex .ru /System /context.js "d.async = 0e.parentNode.insertBefore (d, e)} (to this.document," yandexContextAsyncCallbacks „);
przestrzeń def (planet_name, centrum = "Star")
, [82 ]
druku (planet_name "jest okrążającej" środek)
przestrzeni ("Mars")Kiedy argumenty nie są znane na etapie tworzenia funkcji, używane są argumenty. mogą oznaczać kilka zmiennych tego samego typu lub liście
func def (* args):
powrotu args
func (123 'abc')
# (123 'abc' )
func
#
Wartości kluczy są przekazywane w podobny sposób - za pomocą znaku "**".
Zmienne określone w treści są lokalne, są używane bezpośrednio przez samą funkcję. Aby utworzyć globalną zmienną, używany jest globalny specyfikator.
def get_older ():
globalny wiek
wiek + = 1Obsługiwanyrekursja
fakt def (Lb),
, jeżeli num == 0
powrotny 1
, innym
powrotny Num * Fakt (Lb - 1)Dekoracja metod
Funkcje i metody są syntaktycznie podobne.
Różnica polega na tym, że funkcja jest wywoływana tylko po nazwie.
func ()
A wywołanie metody odbywa się za pośrednictwem operatora "." i wpisuje się nazwę metody, gdzie pierwszym parametrem jest rodzic.
object.func ()
,Tak więc, dekoratorzy Pythona tworzenia metod, jak również funkcję.
Tutaj stworzyliśmy method_friendly_decorator dekorator def (method_to_decorate):
def osłony (ja, lic):
,
leżą = leżą - 3 #
method_to_decorate zwrotny (samodzielne Ile)
owinięcie powrotuF tworzy klasy z metodami, które później modyfikowane ^,
Klasa Lucy (obiekt)
def __init __ (self ):
self.age = 32
@method_friendly_decorator
def sayYourAge (self, lic):
print "? Jestem% s, ale ile dasz" % (Self.age + kłamstwo)
Lucy.sayYourAge (-32)
# 26 i dałem ci co?Oto używany format (). Przypisany do formatowania łańcuchów, używany w następujący sposób:
& lt; script type = "text /javascript" & gt;
var blockSettings3 = {blockID "R-A-70350-44" renderTo "yandex_rtb_R-A-70350-44" asynchroniczny :! 0};
czy (document.cookie.indexOf ("abmatch =") i GT = 0) blockSettings3.statId = 70350;
! Zastosowanie (a, b, c, d, e) {A [c] = A [c] || [] A [c] .Push (funkcja () {Ya.Context.AdvManager.render (blockSettings3)}), e = b.getElementsByTagName ("scenariusz")d = b.createElement ("scenariusz") d.type = "text /JavaScript" d.src = „//an.yandex .ru /System /context.js "d.async = 0e.parentNode.insertBefore (d, e)} (to this.document," yandexContextAsyncCallbacks „);
drukowania ("ciąg {} {}"). Format (1 2),
,
#string 1 2W tym przykładzie wykonania, format argumenty () wskazuje dwie cyfry: 1 2. Zastępują znaki {} w kolejności, w jakiej się znajdują. Formatowanie jest dostępnewyłącznie dla elementów smyczkowych. Oznacza to, że argument staje się pierwszym miejscem nawiasów klamrowych {}, a drugi - odpowiednio drugim. W metodzie formatowania możliwa jest zmiana kolejności wstawiania wartości. Odbywa się to za pośrednictwem indeksów.
, gdzie:
drukowania ("ciąg {} {}") Format (1 2),
,
#string 1 2.: R3r3r3701.
print ("string {1} {0}"). Format (1 2)
#string 2 1Non ciągi formatujące za pomocą klawisza nazwisk w formacie Format (arg1 = wartość1 arg2 = wartość2).
drukowania ("ciąg {arg1} {arg2}"). Format (arg1 arg2 = 1 = 2)
,
#string 1 2można stosować mieszaniny system - gdy w dwóch argumentach tylko jeden z nich ma wartość statyczną. Przesyłanie wartości oznacza indeks i nazwę zmiennej.
& lt; script async = "//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
& lt; skrypt & gt; (adsbygoogle = window.adsbygoogle || []). push ({});drukowania ("ciąg {arg1} {1}"). Format (arg1 = 1 2)
,
#string 1 2, dekoratorzy argumentów [167 ]
Możesz przesłać argumenty do dekoratorów Pythona, które następnie modyfikują przetworzoną funkcję.
d = b.createElement ("scenariusz") d.type = "text /JavaScript" d.src = „//an.yandex .ru /System /context.js "d.async = 0e.parentNode.insertBefore (d, e)} (to this.document," yandexContextAsyncCallbacks „);def dekorator (function_to_decorate):
[169 ]
funkcja def (arg1 arg2):
print "Spójrz, co mam", arg1 arg2
Funkcja powrotuW tym przypadku istnieje @decorator, który modyfikuje funkcję. Argumenty są pomijane w drugim wierszu, transmitowane przez zmienną function_to_decorate.
prowokacji:
@decorator
,
def real_func (Petro)
drukowania "My nazwa" arg1 arg2na ekranie pojawi się:
Zobacz, co mam: Piotr Iwanowicz
Nazywam się Piotr IwanowiczWbudowani dekoratorzy
Wystarczająco jest jeden dekorator, realizuje się kilka poziomów okładów. Kiedy tworzyszWbudowany dekorator zaczyna się od nowej linii, a liczba rzędów określa poziom trudności. Wygląda na to,
@AAA
,
@BBB
@CCC
DEF ():
przechodziZgodnie z AAA (), akceptuje parametry BBB () i obsługuje CCC ().
def f ():
przechodzi
F = (AAA BBB (CCC (funkcja))):funkcji przekazywane trzy różne dekoratory, przypisuje się f (). Każdy z nich zwraca wynik, który z kolei obsługuje opakowanie. Można zauważyć, że ostatnia lista jest pierwszym malarzem, zaczyna funkcji do przetwarzania ().
W Pythonie wyglądają również dekoratory klas.
@firsdecorator
,
@seconddecorator
Klasa CDC
przechodzi
: C = firstdecorator (seconddecorator (CDC) )
XX = C ()
def FN1 (Arg): powrót lambda + Arg 'XX' ()
def FN2 (Arg) N powrotu: ' YY '+ Arg ()
def Fn3 (Arg): powrót lambda' ZZ „+ Arg ()
@ FN1
@ FN2
,
@ Fn3
def myfunc (): # myfunc = fn1 (FN2 (Fn3 (myfunc)))
zwrot 'Python'
print (myfunc ()) # Ostatnia "XXYYZZPython", w tym przypadku, okrywające logicznej implementacji jest przez lambda zastosowanie def
Związek pośredni typu skrypt = "text /JavaScript" & gt;
blockSettings var = {blockID "R-A-70350-45" renderTo "yandex_rtb_R-A-70350-45", asynchroniczny :! 0};
czy (document.cookie.indexOf ("abmatch =") i GT = 0) blockSettings.statId = 70350;
! Zastosowanie (a, b, c, d, e) {A [c] = A [c] || [] A [c] .Push (funkcja () {Ya.Context.AdvManager.render (blockSettings)}), e = b.getElementsByTagName ("scenariusz")