Vấn đề
Python có một vài hình thức cho các nhà trang trí, bạn có thể có một người trang trí đơn giản đơn giản, không có lập luận:
@mydecorator def foo[]: pass
Hoặc một người trang trí với một số lập luận:
@mydecorator[1, 2] def foo[]: pass
Bạn thậm chí có thể trang trí một lớp học:
@mydecorator class Foo[object]: pass
Và mỗi hình thức là một chút khác nhau để thực hiện. Điều này thật khó chịu nếu bạn muốn tạo ra các nhà trang trí dễ sử dụng, nơi nhà phát triển không cần phải lo lắng về
@mydecorator[1, 2] def foo[]: pass0 làm việc khác với
@mydecorator[1, 2] def foo[]: pass1.
Mô -đun trang trí
Lớp
@mydecorator[1, 2] def foo[]: pass2 cho phép bạn dễ dàng tạo các trình trang trí rộng bao gồm tất cả các biểu mẫu và tất cả các loại [chức năng, phương thức, lớp] bằng cách sử dụng cùng một giao diện:
import decorators class mydecorator[decorators.Decorator]: def decorate_func[self, func, *dec_args, **dec_kwargs]: def decorator[*args, *kwargs]: print["You passed into the decorator these arguments", dec_args, dec_kwargs] print["You passed into your function these arguments", args, kwargs] print["Your function is", func] return func[*args, **kwargs] return decorator def decorate_class[self, klass, *dec_args, **dec_kwargs]: print["You passed into the decorator these arguments", dec_args, dec_kwargs] print["Your class is", klass] return klass
Sau đó, bạn có thể sử dụng bộ trang trí này:
@mydecorator def foo[]: print "foo[]" @mydecorator[1, 2, boom="blam"] def bar[*args, **kwargs]: print "bar[]" @mydecorator class Baz[object]: pass @mydecorator[1, 2, boom="blam"] class Che[object]: pass
Bây giờ, người trang trí của bạn có thể trang trí các chức năng hoặc lớp học, vượt qua trong các đối số hoặc không, và bạn không bao giờ phải lo lắng về sự khác biệt tinh tế giữa các nhà trang trí, và tốt nhất là bạn không phải nhân đôi mã.
Trang trí khác
Người nắn dịch
Lớp
@mydecorator[1, 2] def foo[]: pass3 là tốt nếu bạn muốn tạo một bộ trang trí hoàn toàn linh hoạt, nếu bạn muốn thực thi người trang trí của mình chỉ được sử dụng cho một chức năng/phương thức, bạn có thể sử dụng
@mydecorator[1, 2] def foo[]: pass4. Nếu bạn muốn chỉ trang trí một lớp, hãy sử dụng
@mydecorator[1, 2] def foo[]: pass5 và nếu bạn muốn trang trí mọi phiên bản của một lớp, hãy sử dụng
@mydecorator[1, 2] def foo[]: pass6.
Bất kể lớp con nào bạn sử dụng, bạn sẽ ghi đè phương thức
@mydecorator[1, 2] def foo[]: pass7 để trả về chức năng trang trí của bạn:
import decorators class only_func[FuncDecorator]: def decorate[self, func, *dec_a, **dec_kw]: def decorator[*args, **kwargs]: return func[*args, **kwargs] return decorator # this will work @only_func def foo[]: pass # this will fail @only_func class Foo[object]: pass
Trang trí tài sản
Nhà trang trí
@mydecorator[1, 2] def foo[]: pass8 là một sự thay thế thả vào cho bộ trang trí
@mydecorator[1, 2] def foo[]: pass8 tích hợp của Python, với chức năng bổ sung:
from decorators import property class Foo[object]: @property def bar[self]: """This will act just like python's built-in @property decorator""" return 1 @property[cached="_che"] def che[self]: """This will cache the return value into _che and add a setter/deleter""" return 1
Trang trí lớp học
Cho phép bạn tạo một thuộc tính trên lớp:
from decorators import classproperty class Foo[object]: @classproperty def bar[cls]: """Available as Foo.bar""" return 1 print[Foo.bar] # 1
Cài đặt
Sử dụng PIP:
pip install decorators
Hoặc, để có được phần mới nhất và lớn nhất từ nguồn:
pip install -U "git+//github.com/Jaymon/decorators#egg=decorators"