2011-11-30 12 views
21

Jaka jest różnica między "dekoratorami Pythona" a "wzorcem dekoratora"?Jaka jest różnica między dekoratorami Python a wzorem dekoratora?

Kiedy należy używać dekoratorów Python i kiedy powinienem użyć wzoru dekoratora?

Poszukuję przykładów dekoratorów Python i wykonania dekoratora tak samo?


@AcceptedAnswer
wiem, że Jakob Bowyer's answer jest prawidłowy. Ale to odpowiedź Strikara, która pozwoliła mi zrozumieć, dlaczego.


Po odpowiedzi Srikara i badaniu podanych zasobów napisałem ten przykład, aby móc wizualizować i rozumieć konstruktory Pythona i wzór dekoratora.

muszę zgadzam z Strikar za „dekoratorów Pythona nie są implementacją wzorca dekorator”. Po tym, czego się nauczyłam Jestem przekonany, że dekoratory Python są implementacją Patternu Dekoratora. Po prostu nie w klasyczny sposób.

także, muszę dodać, że pomimo faktu, że Strikar powiedział „Python dekoratorów rozszerzyć funkcjonalność funkcji i metod w czasie definiowaniamożna łatwo używać dekoratorów Pytohon w czasie wykonywania.

Jednak nadal zaznaczam odpowiedź Stikera jako zaakceptowaną, ponieważ pomogło mi to zrozumieć Implementationwzoru dekoratora w Pythonie.

+1

@Srikar jest poprawny. [Here] (http://stackoverflow.com/q/3118929/146792) to kolejne pytanie, które może Cię zainteresować! – mac

+1

@Srikar, nie mogę zaakceptować Snswera, który nie rozwiązuje problemu opisanego w pytaniu, przepraszam, ale większość proponowanych rozwiązań w moich pytaniach nie działa. – seler

+0

@seler fair enough. –

Odpowiedz

24

Dekorator dekoracyjny Wzór - W programowaniu obiektowym wzorzec dekoratora jest wzorcem projektowym, który pozwala dynamicznie dodawać zachowanie do istniejącego obiektu. Wzorzec dekoratora może być używany do rozszerzania (dekorowania) funkcjonalności określonego obiektu w czasie wykonywania, niezależnie od innych wystąpień tej samej klasy, pod warunkiem, że pewne prace przygotowawcze zostaną wykonane w czasie projektowania.

Dekoratory w Pythonie - Mimo nazwy, dekoratory Python nie są implementacją wzoru dekoratora. Wzorzec dekoratora jest wzorcem projektowym stosowanym w statycznie napisanych obiektowych językach programowania, aby umożliwić dodawanie funkcjonalności do obiektów w czasie wykonywania; Dekoratory Python dodają funkcjonalność do funkcji i metod w czasie definiowania, a zatem są konstruktami wyższego poziomu niż klasy wzorów dekoratorów. Sam wzór dekoratora można łatwo zastosować w języku Python, ponieważ język jest pisany kaczką i dlatego zwykle nie jest uważany za taki. Zatem w Pythonie dekoratorem jest dowolny wywoływany obiekt Python, który służy do modyfikowania definicji funkcji, metody lub klasy.

Mam nadzieję, że różnica była jasna. Na wypadek, gdybyś nie do końca zrozumiał, przejdź przez te linki.będzie pochodzić z więcej niż oczywiste, w końcu to -

How to make a chain of function decorators?

Implementing the decorator pattern in Python

What is the difference between using decorators and extending a sub class by inheritance?

Python Class Decorator

PyWiki - Python Decorators - A detailed discourse

Python Decorators Made Easy

source1 & source2

+0

Możesz chcieć spojrzeć na edytowane pytanie. – seler

0

Dekoratory w Pythonie to zastosowanie dekoratorów w projektowaniu dekoratorów. Obaj mówią o implementacji językowej, a drugiej o koncepcji projektowania i informatyki.

+0

nie patrz tutaj http://wiki.python.org/moin/DecoratorPattern – Freelancer

1

Różnica jest następująca:

(A) dekoratorzy Python są związane z istniejącego sposobu i zmienić zachowanie tego sposobu. Przykład:

@modifyBehavior 
def original(myString): 
    print myString 

Zachowanie oryginału jest nadpisywane. Nie możesz tego użyć, aby dodać nową funkcjonalność.

(b) Wzór dekoratora dotyczy polimorfizmu. W powyższym przykładowym kodzie zachowanie programu Decorator.something_useful jest nadpisywane. Oryginalna metoda została utracona. To naprawdę nie jest wzór dekoratora. Powinieneś chcieć ulepszyć lub dodać funkcjonalność, a nie zastąpić metodę. Powinieneś upewnić się, że a.something_useful (string) zwraca to samo co b.something_useful (string). W rzeczywistości w przypadku wzoru dekoratora zazwyczaj zastępuje się oryginalny obiekt. Oto, co mam na myśli:

class Class(object): 
    def __init__(self): 
     pass 
    def something_useful(self, string): 
     return string 

class Decorator(object): 
    def __init__(self, wrapped): 
     self._wrapped = wrapped 
    def withUnderscores(self, string): 
     return '_'.join(string.split(' ')) 
    def __getattr__(self, name): 
     return getattr(self._wrapped, name) 


if __name__ == '__main__': 
    string = 'Lorem ipsum dolor sit amet.' 
    obj = Class() 
    print('Original: ', obj.something_useful(string)) 
    #This has no underscore function. Use decorator to add. 
    obj = Decorator(obj) 
    print('Replaced spaces: ', obj.withUnderscores(string)) 
    print('Original still works: ', obj.something_useful(string)) 

Możesz mieć kilka dekoratorów, aby dodać funkcjonalność. Dzięki temu możesz dodać tylko to, czego potrzebujesz, kiedy jej potrzebujesz. Więcej informacji: GoF

Powiązane problemy