Phía trước phát quá hai thiên trang trí khí văn chương, lúc ấy vì tranh thủ tròng mắt, tiêu đề lấy được hư đầu ba não. Hiện tại đem hai thiên xác nhập ở bên nhau, một lần nữa phát ở 『PythonChung kết giả 』 hệ liệt trung, phương tiện đại gia học tập.
Trước đó không lâu, ta phỏng vấn quá một cái yêu cầu lương tháng 30k+ lập trình viên, còn có một cái chiết đại tốt nghiệp tân nhân, hai người đều tự xưng quen thuộc nhất biên trình ngôn ngữ là Python, nhưng không ai biết trang trí khí. Xem xong áng văn chương này, ít nhất ngươi ở phương diện này siêu việt bọn họ.
Nhìn thấu áng văn chương này, ngươi ít nhất vượt qua 80% Python học tập giả.
Liền tính một vòng học thấu một cái quan trọng tri thức điểm, không lâu lúc sau, ngươi liền sẽ trở thành rất lợi hại tồn tại! Cố lên!!
Đối với Python học tập giả, một khi qua nhập môn giai đoạn, ngươi cơ hồ nhất định sẽ dùng đến Python trang trí khí.
Nó thường xuyên sử dụng ở rất nhiều địa phương, tỷ như Web khai phá, nhật ký xử lý, tính năng sưu tập, quyền hạn khống chế chờ.
Còn có một cái cực kỳ quan trọng địa phương, đó chính là phỏng vấn thời điểm. Đối, trang trí khí là phỏng vấn trung nhất thường thấy vấn đề chi nhất!
Thực chiến nhập môn
Tung ra vấn đề
Xem này đoạn số hiệu:
def step1():
print('step1.......')
def step2():
print('step2......')
def step3():
print('step3......')
step1()
step2()
step3()
Số hiệu trung định nghĩa 3 cái hàm số, sau đó phân biệt thuyên chuyển này 3 cái hàm số. Giả thiết, chúng ta phát hiện số hiệu vận hành rất chậm, chúng ta muốn biết mỗi cái hàm số vận hành phân biệt hoa bao nhiêu thời gian.
Bổn biện pháp giải quyết
Chúng ta có thể ở mỗi cái hàm số trung tăng thêm tính giờ số hiệu:
Đệ nhất hành ký lục bắt đầu thời gian
Chấp hành xong nghiệp vụ logic ký lục kết thúc thời gian
Kết thúc thời gian giảm đi bắt đầu thời gian, tính ra hàm số chấp hành dùng khi
Phía dưới ví dụ chỉ ở step1 trung tăng thêm tương quan số hiệu làm thí dụ mẫu, ngươi có thể tự hành cấp step2 cùng step3 tăng thêm tương quan số hiệu.
import time
def step1():
start = time.time()
print('step1.......')
end = time.time()
used = end - start
print(used)
def step2():
print('step2......')
def step3():
print('step3......')
step1()
step2()
step3()
Phương pháp này được không! Nhưng dùng ngươi ngón chân ngẫm lại cũng sẽ cảm thấy, phương pháp này thực rườm rà, thực vụng về, rất nguy hiểm!
Nơi này chỉ có 3 cái hàm số, nếu có 30 cái hàm số, kia không phải muốn người chết lạp. Vạn nhất sửa chữa thời điểm không cẩn thận, đem nguyên lai hàm số cấp sửa hỏng rồi, mặt mũi đều ném hết, liền phải bị người BS!
Nhất định có một cái càng tốt phương pháp giải quyết!
Dùng trang trí khí giải quyết
Càng tốt phương pháp giải quyết là sử dụng trang trí khí.
Trang trí khí cũng không có cái gì cao thâm ngữ pháp, nó chính là một cái thực hiện cấp hiện có hàm số tăng thêm trang trí công năng hàm số, chỉ thế mà thôi!
import time
def timer(func):
''' thống kê hàm số vận hành thời gian trang trí khí '''
def wrapper():
start = time.time()
func()
end = time.time()
used = end - start
print(f'{func.__name__} used {used}')
return wrapper
def step1():
print('step1.......')
def step2():
print('step2......')
def step3():
print('step3......')
timed_step1 = timer(step1)
timed_step2 = timer(step2)
timed_step3 = timer(step3)
timed_step1()
timed_step2()
timed_step3()
Mặt trên timer hàm số chính là cái trang trí khí.
Nó tham số là yêu cầu bị trang trí hàm số
Phản hồi giá trị là định nghĩa mới một cái đóng gói vốn có hàm số hàm số.
Định nghĩa mới hàm số trước ký lục bắt đầu thời gian, thuyên chuyển bị trang trí hàm số, sau đó lại tính toán dùng bao nhiêu thời gian.
Đơn giản nói chính là đem nguyên lai hàm số cấp bao lên, ở không thay đổi nguyên hàm số số hiệu dưới tình huống, ở bên ngoài khởi tới rồi trang trí tác dụng, đây là trong truyền thuyết trang trí khí. Nó kỳ thật chính là cái bình thường hàm số.
Nếu ngươi cảm thấy có điểm mộng bức, yêu cầu tăng mạnh một ít đối Python hàm số lý giải. Hàm số:
Có thể làm tham số truyền lại
Có thể làm phản hồi giá trị
Cũng có thể định nghĩa ở hàm số bên trong
Sau đó, chúng ta không hề trực tiếp thuyên chuyển step1, mà là:
Trước thuyên chuyển timer hàm số, sinh thành một cái đóng gói step1 tân hàm số timed_step1.
Dư lại chính là thuyên chuyển cái này tân hàm số time_step1(), nó sẽ giúp chúng ta ký lục thời gian.
timed_step1 = timer(step1)
timed_step1()
Ngắn gọn điểm, cũng có thể như vậy viết:
timer(step1)()
timer(step2)()
timer(step3)()
Như vậy có thể ở không sửa chữa vốn có hàm số số hiệu dưới tình huống, cấp hàm số tăng thêm trang trí tính tân công năng.
Nhưng là vẫn cứ yêu cầu sửa chữa thuyên chuyển hàm số địa phương, thoạt nhìn còn chưa đủ ngắn gọn. Có hay không càng tốt biện pháp đâu? Đương nhiên là có!
Trang trí khí ngữ pháp vỏ bọc đường
Chúng ta có thể ở bị trang trí hàm số trước sử dụng @ ký hiệu chỉ định trang trí khí. Như vậy liền không cần sửa chữa thuyên chuyển địa phương, thế giới này thanh tịnh. Phía dưới số hiệu cùng thượng một đoạn số hiệu công năng giống nhau. Ở vận hành trình tự thời điểm, Python giải thích khí sẽ căn cứ @ đánh dấu tự động sinh thành trang trí khí hàm số, cũng thuyên chuyển trang trí khí hàm số.
import time
def timer(func):
''' thống kê hàm số vận hành thời gian trang trí khí '''
def wrapper():
start = time.time()
func()
end = time.time()
used = end - start
print(f'{func.__name__} used {used}')
return wrapper
@timer
def step1():
print('step1.......')
@timer
def step2():
print('step2......')
@timer
def step3():
print('step3......')
step1()
step2()
step3()
Tới rồi nơi này, trang trí khí trung tâm khái niệm liền nói xong.
Dư lại cơ bản đều là ở bất đồng trường hợp hạ ứng dụng. Nếu ngươi là người bận rộn, không nghĩ học quá sâu, có thể lục soát tàng bổn văn chương, về sau lại trở về xem.
Nhưng là nhớ rõ điểm đang xem. Nghe nói điểm đến độ biến soái, cũng tìm được rồi hảo công tác, hoặc là thăng chức tăng lương.
Tiến giai cách dùng
Mặt trên là một cái đơn giản nhất ví dụ, bị trang trí hàm số đã không có tham số, cũng không có phản hồi giá trị. Phía dưới tới xem có tham số cùng phản hồi giá trị tình huống.
Mang tham số hàm số
Chúng ta đem step1 sửa chữa một chút, truyền vào một cái tham số, tỏ vẻ phải đi vài bước.
import time
def timer(func):
''' thống kê hàm số vận hành thời gian trang trí khí '''
def wrapper():
start = time.time()
func()
end = time.time()
used = end - start
print(f'{func.__name__} used {used}')
return wrapper
@timer
def step1(num):
print(f' ta đi rồi #{num} bước ')
step1(5)
Lại đi vận hành, liền báo sai rồi:
TypeError: wrapper() takes 0 positional arguments but 1 was given
Đây là bởi vì, mặt ngoài chúng ta viết chính là step1(5), trên thực tế Python là trước thuyên chuyển wrapper() hàm số. Cái này hàm số không tiếp thu tham số, cho nên báo sai rồi.
Vì giải quyết vấn đề này, chúng ta chỉ cần cấp wrapper hơn nữa tham số liền có thể.
import time
def timer(func):
''' thống kê hàm số vận hành thời gian trang trí khí '''
def wrapper(*args, **kwargs):
start = time.time()
func(*args, **kwargs)
end = time.time()
used = end - start
print(f'{func.__name__} used {used}')
return wrapper
wrapper sử dụng thông xứng phù, *args đại biểu sở hữu vị trí tham số, **kwargs đại biểu sở hữu từ ngữ mấu chốt tham số. Như vậy liền có thể ứng đối bất luận cái gì tham số tình huống.
wrapper thuyên chuyển bị trang trí hàm số thời điểm, chỉ cần còn nguyên đem tham số lại truyền lại đi vào là được.
Nếu đối từ ngữ mấu chốt tham số cùng vị trí tham số không rõ, có thể ở B trạm tìm tòi "Mạch thúc tham số", học tập tương quan video.
Hàm số phản hồi giá trị
Nếu bị trang trí hàm số func có phản hồi giá trị, wrapper cũng chỉ cần đem func phản hồi giá trị phản hồi là được.
import time
def timer(func):
''' thống kê hàm số vận hành thời gian trang trí khí '''
def wrapper(*args, **kwargs):
start = time.time()
ret_value = func(*args, **kwargs)
end = time.time()
used = end - start
print(f'{func.__name__} used {used}')
return ret_value
return wrapper
@timer
def add(num1, num2):
return num1 + num2
sum = add(5, 8)
print(sum)
Nơi này ta tân bỏ thêm một cái add hàm số, tính toán hai cái số chi cùng.
Ở wrapper hàm số trung, chúng ta trước bảo tồn func phản hồi giá trị đến ret_value, sau đó ở wrapper cuối cùng phản hồi cái này giá trị là được.
Đến nơi đây, ngươi lại tiến một bước, ngươi có thể đánh bại 88.64% Python học tập giả. Nhưng còn chưa đủ, mặt sau còn có:
Loại trang trí khí ( mặt trên đều là hàm số trang trí khí )
Nhiều trang trí khí xâu chuỗi
Mang tham số trang trí khí ( bất đồng với mặt trên mang tham số hàm số )
Mang trạng thái trang trí khí
Dùng loại phong trang trang sức khí
Trang trí khí thường dùng tình huống nêu ví dụ
Có vị đồng học xem xong phía trước nội dung, cảm thấy chính mình nắm giữ thực hảo, liền đi phỏng vấn.
Kết quả chăn thí quan một cái “Như thế nào ở Python trung thực hiện đơn lệ hình thức” vấn đề cấp đương trường hỏi đổ.
Tức giận đến hắn đi lên chính là hai cái tát tai, bất quá không phải đánh phỏng vấn quan, là đánh chính mình, hận chính mình không có chờ đọc thấu chỉnh thiên lại đi phỏng vấn. Cho nên mọi người đều kiên nhẫn đọc xong.
Ngươi nhất định dùng quá trang trí khí Decorator
Kỳ thật Decorator liền ở chúng ta bên người, chỉ là chúng ta khả năng không biết chúng nó là trang trí khí. Ta tới nói mấy cái: @classmethod @staticmethod @property
Có hay không một loại "Ta dựa" xúc động?!
Đối, này đó rất quan trọng ngữ pháp, bất quá là trang trí khí ứng dụng mà thôi.
Tới xem một cái số hiệu ví dụ:
class Circle:
# bán kính dùng hạ hoa tuyến mở đầu, tỏ vẻ tư hữu lượng biến đổi
def __init__(self, radius):
self._radius = radius
# dùng property trang trí khí sáng tạo giả thuyết bán kính thuộc tính
@property
def radius(self):
return self._radius
# dùng setter trang trí khí cấp bán kính thuộc tính tăng thêm phú giá trị thao tác
@radius.setter
def radius(self, value):
if value >= 0:
self._radius = value
else:
raise ValueError( "Radius must be positive" )
# dùng property trang trí khí sáng tạo giả thuyết diện tích thuộc tính
@property
def area(self):
return self.pi() * self.radius**2
def cylinder_volume(self, height):
return self.area * height
# loại phương pháp
@classmethod
def unit_circle(cls):
return cls(1)
# trạng thái tĩnh phương pháp
@staticmethod
def pi():
return 3.1415926535
Lại đến sáng tạo hai cái trang trí khí luyện luyện tập
Ngươi đừng tưởng rằng ngươi đã nắm giữ trang trí khí, ngươi chỉ là nghe hiểu.
Từ nghe hiểu đến có thể động thủ viết ra tới, lại đến chăn thí thời điểm, có thể lưu sướng nói ra, kia còn kém hai mươi vạn tám ngàn dặm đâu!
Nhất định đến nhiều động thủ! Cho nên nắm chặt thời gian, lập tức lại đến sáng tạo hai cái trang trí khí.
Số hiệu điều chỉnh thử trang trí khí
Hiện tại chúng ta tới sáng tạo một cái trang trí khí: Nó sẽ đóng dấu hàm số tham số, cùng với phản hồi giá trị.
Nếu ngươi có thực tế hạng mục kinh nghiệm, ngươi nhất định sẽ biết cái này rất hữu dụng. Này còn không phải là tự động đóng dấu nhật ký sao! Là lập trình viên tìm con rệp chuẩn bị thuốc hay a.
Đến xem số hiệu:
def debug(func):
def wrapper_debug(*args, **kwargs):
print(f'{func.__name__}:{args}, {kwargs}')
ret_val = func(*args, **kwargs)
print(f'return: {ret_val}')
return ret_val
return wrapper_debug
@debug
def add(a, b):
return a + b
add(1, 3)
add(2, 3)
add(4, 3)
Ở wrapper_debug hàm số trung, chúng ta trước đóng dấu sở hữu tham số, lại thuyên chuyển nguyên hàm số, cuối cùng trước đóng dấu phản hồi giá trị, lại phản hồi phản hồi giá trị. Nơi này cũng không có tân ngữ pháp tri thức, chính là vì luyện tập.
Trang B thần kỳ - làm trình tự chạy chậm một chút
Đã từng ta còn trẻ, nhìn đến một cái đại thần số hiệu bên trong có như vậy một hàng:
sleep(random(1,5))
Bởi vì có này hành số hiệu, trình tự vận hành thời điểm rất chậm. Ta liền hỏi đại thần, vì cái gì muốn như vậy. Đại thần lời nói thấm thía cùng ta nói:
Ngươi còn trẻ! Ta đem cái này trình tự giao phó cấp khách hàng, khách hàng sẽ cảm thấy có điểm chậm, nhưng còn có thể nhẫn.
Nhịn không được, sẽ tìm đến ta ưu hoá tính năng. Ta một cái ngón tay liền đem tính năng ưu hoá lên rồi, khách hàng nhất định đối ta ngũ thể đầu địa. Hơn nữa chúng ta công ty đuôi khoản cũng cho chúng ta.
Người trẻ tuổi, nhiều học điểm! Đây là lịch duyệt, lịch duyệt!
Đáng tiếc ta học nhiều năm như vậy, cũng không học được loại này lịch duyệt.
Bất quá có đôi khi, bởi vì các loại nguyên nhân, chúng ta xác thật yêu cầu làm trình tự biến chậm một chút. Trang trí khí liền bài thượng công dụng:
import time
def slow(func):
def wrapper_slow(*args, **kwargs):
print(f'{func.__name__} sleeping 1 second')
time.sleep(1)
ret_val = func(*args, **kwargs)
return ret_val
return wrapper_slow
@slow
def add(a, b):
return a + b
add(1, 3)
Vận hành một chút, ngươi liền sẽ rất có cảm giác thành tựu! Xác thật chậm!
Mặt trên cái kia chân thật truyện cười, ta khuyên đại gia cùng ta giống nhau, vẫn luôn đều học không được. Lâu ngày thấy lòng người, hố người sự tình không thể làm.
Trang trí khí khuôn mẫu
Trải qua phía trước mấy cái ví dụ, chúng ta có thể tổng kết ra một cái trang trí khí khuôn mẫu.
Dựa theo cái này khuôn mẫu, có thể nhẹ nhàng viết ra trang trí khí:
def decorator(func):
def wrapper_decorator(*args, **kwargs):
# thuyên chuyển trước thao tác
ret_val = func(*args, **kwargs)
# thuyên chuyển sau thao tác
return ret_val
return wrapper_decorator
Dựa theo cái này khuôn mẫu:
Sửa chữa trang trí khí tên, đem decorator thay đổi vì cụ thể tên.
Ở chú thích “Thuyên chuyển trước thao tác” địa phương viết chính mình tưởng viết số hiệu
Ở chú thích “Thuyên chuyển sau thao tác” địa phương viết chính mình tưởng viết số hiệu.
Mang tham số trang trí khí
Mặt trên kia hai cái đều là bình thường trang trí khí ứng dụng, chúng ta không thể tiếp tục tự High đi xuống. Chúng ta phải học tập tân tri thức.
Mặt trên cái kia slow trang trí khí, nếu có thể truyền vào rốt cuộc muốn sleep vài giây thì tốt rồi, hiện tại là cố định 1 giây, cái này không hương.
Chú ý phân chia, nơi này tham số là chỉ trang trí khí tham số. Cùng phía trước nhắc tới hàm số tự thân tham số là bất đồng.
Ta muốn cho nó nhiều chậm liền nhiều chậm, sau đó chúng ta lại trong khoảnh khắc xoay chuyển càn khôn, như vậy khách hàng liền càng vì ta thần hồn điên đảo.
Muốn cho trang trí khí tiếp thu tham số, yêu cầu ở bình thường trang trí khí bên ngoài lại tròng lên một tầng:
import time
def slow(seconds):
def decorator_slow(func):
def wrapper_slow(*args, **kwargs):
print(f'{func.__name__} sleeping {seconds} second')
time.sleep(seconds)
ret_val = func(*args, **kwargs)
return ret_val
return wrapper_slow
return decorator_slow
# tăng thêm trang trí khí thời điểm có thể truyền vào muốn thả chậm vài giây tham số. @slow(2)def add(a, b):
return a + b
# chấp hành chuyến này sẽ tạm dừng 2 giây
add(1, 3)
Trước kia trang trí khí, là hàm số bên trong có một cái bên trong hàm số (2 tầng hàm số ), hiện tại cái này có 3 tầng hàm số:
Đầu tiên là slow, tiếp thu giây số làm tham số
slow bên trong sáng lập decorator_slow hàm số, cái này chính là cùng nguyên lai giống nhau trang trí khí hàm số
wrapper_slow bên trong lại sáng lập wrapper_slow hàm số.
Kỳ thật mặt sau hai tầng chính là cùng phía trước giống nhau, duy nhất khác nhau là bên ngoài lại bỏ thêm một tầng.
Tại sao lại như vậy đâu? Vì cái gì nhất bên ngoài một tầng không cần truyền vào func tham số đâu?
Đây là bởi vì:
Đương Python phát hiện slow(2) cái này trang trí khí tự mang theo tham số khi, nó liền không hề truyền vào trước mặt hàm số làm tham số, trực tiếp thuyên chuyển slow. Đây là Python giải thích khí quy định.
slow quay trở về một cái hàm số, lúc này Python sẽ lại đem trước mặt hàm số truyền vào đi vào, lúc này liền trở thành một cái bình thường trang trí khí.
Đây là nói nhất bên ngoài một tầng công năng chính là vì xử lý trang trí khí tham số.
Nếu ngươi lập tức không thể lý giải, trước đem số hiệu gõ ra tới, ngươi liền lý giải. Chính cái gọi là: Thuộc lòng ba trăm bài thơ Đường, sẽ không ngâm thơ cũng sẽ ngâm!
Lại đến xem một cái trang trí khí mang tham số ví dụ:
def repeat(nums=3):
def decorator_repeat(func):
def wrapper_repeat(*args, **kwargs):
for _ in range(nums):
func(*args, **kwargs)
return wrapper_repeat
return decorator_repeat
@repeat(3)
def run():
print(' chạy bộ có lợi cho thân thể khỏe mạnh, tới một vòng ')
# nơi này sẽ lặp lại chấp hành 3 thứ
run()
Cái này trang trí cùng slow trang trí khí giống nhau hố người, nó sẽ nhiều lần lặp lại chấp hành một cái phương pháp, hơn nữa có thể động thái chỉ định muốn lặp lại vài lần.
Tinh tế phẩm vị một chút cái này 3 tầng hàm số, nó là như thế nào thực hiện mang tham số trang trí khí. Này hai cái ví dụ đều đã hiểu, ngươi liền đi ở treo lên đánh phỏng vấn quan trên đường.
Loại trang trí khí
Còn nhớ rõ phía trước cho chính mình hai cái cái tát đồng học sao? Nếu hắn hiện tại đi phỏng vấn, vẫn là cho chính mình hai cái cái tát, vẫn là không biết như thế nào thực hiện đơn lệ hình thức.
Đơn lệ hình thức, là chỉ một cái loại chỉ có thể sáng tạo một cái ví dụ thực tế, là nhất thường thấy thiết kế hình thức chi nhất.
Tỷ như trang web trình tự có một cái loại thống kê trang web phỏng vấn nhân số, cái này loại chỉ có thể có một cái ví dụ thực tế. Nếu mỗi lần phỏng vấn đều sáng tạo một cái tân ví dụ thực tế, người nọ số liền vĩnh viễn là 1.
Ở Python trung có thể dùng trang trí khí thực hiện đơn lệ hình thức.
Phía trước trang trí khí đều là dùng để trang trí hàm số, hoặc là dùng để trang trí loại phương pháp, tỷ như chúng ta viết slow, debug, timer; Python tự mang staticmethod, classmethod chờ.
Kia nếu đem trang trí khí phóng tới loại danh phía trước sẽ như thế nào đâu? Tới xem này đoạn số hiệu:
from slow import slow
@slow
class Counter():
def __init__(self):
self._count = 0
def visit(self):
self._count += 1
print(f'visiting: {self._count}')
c1 = Counter()
c1.visit()
c1.visit()
c2 = Counter()
c2.visit()
c2.visit()
Cái này loại tên là Counter(), xem tên đoán nghĩa chính là dùng để làm đếm hết. Nó có một cái bên trong lượng biến đổi gọi là _count, mỗi lần thuyên chuyển Counter visit() phương pháp, đếm hết liền sẽ thêm 1.
Đệ nhất hành, chúng ta dẫn vào phía trước viết slow trang trí khí, là cái kia bình thường không mang theo tham số slow. Trang trí khí chính là cái hàm số, đương nhiên có thể bị import tiến vào.
Lần này @slow đặt ở Counter loại danh phía trước, mà không phải phương pháp phía trước, sẽ phát sinh cái gì đâu? Vận hành mặt trên số hiệu, sẽ phát hiện như vậy kết quả:
Counter sleeping 1 second
visiting: 1
visiting: 2
Counter sleeping 1 second
visiting: 1
visiting: 2
Này thuyết minh chỉ có ở sáng tạo Counter ví dụ thực tế thời điểm, mới có thể sleep một giây, thuyên chuyển visit hàm số thời điểm, sẽ không sleep.
Cho nên, loại trang trí khí trên thực tế trang trí chính là loại khởi động lại phương pháp. Chỉ có khởi động lại thời điểm sẽ trang trí một lần.
Dùng trang trí khí thực hiện đơn lệ hình thức
Mặt trên vận hành kết quả thực làm người thất vọng, nếu như đi phỏng vấn, vẫn là sẽ cho chính mình hai cái tát tai.
Làm một cái máy đếm, hẳn là đếm hết là không ngừng chồng lên.
Chính là mặt trên số hiệu, sáng lập hai cái máy đếm, chính mình ký lục chính mình. Vô nghĩa a!
Chúng ta hiện tại liền dùng loại trang trí khí cải tạo nó:
def singleton(cls):
''' sáng tạo một cái đơn lệ hình thức '''
def single_wrapper(*args, **kwargs):
if not single_wrapper.instance:
single_wrapper.instance = cls(*args, **kwargs)
return single_wrapper.instance
single_wrapper.instance = None
return single_wrapper
@singleton
class Counter():
def __init__(self):
self._count = 0
def visit(self):
self._count += 1
print(f'visiting: {self._count}')
c1 = Counter()
c1.visit()
c1.visit()
c2 = Counter()
c2.visit()
c2.visit()
Trước tới vận hành một chút:
visiting: 1
visiting: 2
visiting: 3
visiting: 4
Kết quả thực vừa lòng, tuy rằng sáng lập hai cái Counter, đếm hết là ký lục ở bên nhau. Này chủ yếu đến ích với cái này tân trang trí khí:
def singleton(cls):
''' sáng tạo một cái đơn lệ hình thức '''
def single_wrapper(*args, **kwargs):
# nếu không có ví dụ thực tế, tắc sáng tạo ví dụ thực tế
if not single_wrapper.instance:
single_wrapper.instance = cls(*args, **kwargs)
# phản hồi nguyên lai ví dụ thực tế, hoặc là tân ví dụ thực tế
return single_wrapper.instance
# cấp tân sáng tạo hàm số tăng thêm một cái thuộc tính bảo tồn ví dụ thực tế
single_wrapper.instance = None
return single_wrapper
Nó cùng mặt khác trang trí khí cơ bản giống nhau, nó bất đồng chỗ ở chỗ này một hàng:
single_wrapper.instance = None
Ở sáng tạo xong hàm số sau, lại cấp hàm số tăng thêm một cái thuộc tính, dùng để bảo tồn ví dụ thực tế, bắt đầu vì None, chính là không có ví dụ thực tế.
Lại đến phân tích một chút số hiệu logic:
Trước phán đoán hay không có ví dụ thực tế, nếu không có liền sáng tạo một cái. Trái lại, đã có liền không cần sáng tạo.
Phản hồi ví dụ thực tế.
Đem cái này trang trí khí thêm đến loại thượng thời điểm, liền tương đương với thêm tới rồi khởi động lại phương pháp.
Khi chúng ta sáng tạo Counter thời điểm, bị cái này trang trí khí tiệt hồ, nó sẽ phản hồi một cái đã sáng tạo tốt ví dụ thực tế. Nếu không có ví dụ thực tế, nó sẽ sáng tạo một cái.
Nói cách khác, mặc kệ thuyên chuyển Counter() bao nhiêu lần, cuối cùng cũng chỉ có một cái ví dụ thực tế. Đây là thực hiện đơn lệ hình thức.
Nếu có điểm không hiểu, lại xem một lần, vì chính là ở phỏng vấn quan trước mặt dương mi thổ khí.
Mang trạng thái trang trí khí
Mặt trên ví dụ trung, chúng ta nhìn đến trang trí khí chính mình bảo tồn một cái ví dụ thực tế, ngươi muốn thời điểm nó liền cho ngươi này một cái, cho nên mới thực hiện đơn lệ hình thức. Loại này liền kêu làm mang trạng thái trang trí khí.
Chúng ta lại đến xem một ví dụ. count trang trí khí sẽ ký lục một cái hàm số bị thuyên chuyển số lần:
def count(func):
def wrapper_count():
wrapper_count.count += 1
print(f'{func.__name__}: Đệ {wrapper_count.count} thứ thuyên chuyển ')
func()
wrapper_count.count = 0
return wrapper_count
@count
def run():
print(' chạy bộ có lợi cho thân thể khỏe mạnh, tới một vòng ')
run()
run()
run()
Vận hành kết quả:
run: Đệ 1 thứ thuyên chuyển
Chạy bộ có lợi cho thân thể khỏe mạnh, tới một vòng
run: Đệ 2 thứ thuyên chuyển
Chạy bộ có lợi cho thân thể khỏe mạnh, tới một vòng
run: Đệ 3 thứ thuyên chuyển
Chạy bộ có lợi cho thân thể khỏe mạnh, tới một vòng
Điểm mấu chốt liền ở chỗ này một hàng:
wrapper_count.count = 0
Cấp wrapper_count hàm số tăng thêm count thuộc tính, tới ký lục hàm số thuyên chuyển số lần, nó cũng là một cái có trạng thái trang trí khí.
Nhiều trang trí khí khảm bộ
Một cái hàm số chỉ có thể có một cái trang trí khí sao?
Trang trí khí bản chất chính là trước thuyên chuyển trang trí khí, trang trí khí lại thuyên chuyển hàm số. Nếu như vậy, như vậy nhiều thuyên chuyển mấy tầng cũng không sao đi.
Tới xem cái này ví dụ:
import time
from slow import slow
def timer(func):
def wrapper():
start_time = time.perf_counter()
func()
end_time = time.perf_counter()
used_time = end_time - start_time
print(f'{func.__name__} used {used_time}')
return wrapper
@slow
@timer
def run():
print(' chạy bộ có lợi cho thân thể khỏe mạnh, tới một vòng ')
run()
Cái này ví dụ trung, run hàm số dùng hai cái trang trí khí, slow cùng timer. Nó chấp hành quá trình liền tương đương với:
slow(time(run()))
Từ trên xuống dưới thuyên chuyển, đầu tiên là thuyên chuyển slow, sau đó slow đi thuyên chuyển timer, sau đó timer đi thuyên chuyển run, cho nên chấp hành kết quả là:
run sleeping 1 second
Chạy bộ có lợi cho thân thể khỏe mạnh, tới một vòng
wrapper_slow used 1.0026384350000002
Python trang trí khí bảo tàng kho
Không sai biệt lắm, lý giải thấu này đó nguyên lý, ngươi liền tính không cho phỏng vấn quan hai cái tát tai, ít nhất cũng không cần cho chính mình. Tương quan vấn đề liền tính không phải đối đáp trôi chảy, cũng có thể nhẹ nhàng ứng đối đi.
Trang trí khí quá trọng yếu, có rất nhiều đại thần viết đủ loại trang trí khí, Python phía chính phủ hồ sơ vì một phần trang trí khí danh sách, ở công cụ tìm kiếm lục soát: PythonDecoratorLibrary.