Logo Zephyrnet

8 trình trang trí Python tích hợp để viết mã trang nhã – KDnuggets

Ngày:

8 trình trang trí Python tích hợp để viết mã trang nhã
Hình ảnh của Editor
 

Python, với cú pháp rõ ràng và dễ đọc, là ngôn ngữ lập trình cấp cao được sử dụng rộng rãi. Python được thiết kế để dễ sử dụng, nhấn mạnh đến tính đơn giản và giảm chi phí bảo trì chương trình. Nó đi kèm với một thư viện mở rộng giúp nhà phát triển giảm nhu cầu viết mã từ đầu và tăng năng suất của nhà phát triển. Một tính năng mạnh mẽ của Python góp phần tạo nên sự sang trọng cho mã là trình trang trí.

Trong Python, trình trang trí là một hàm cho phép bạn sửa đổi hành vi của một hàm khác mà không thay đổi logic cốt lõi của nó. Nó lấy một hàm khác làm đối số và trả về hàm có chức năng mở rộng. Bằng cách này, bạn có thể sử dụng trình trang trí để thêm một số logic bổ sung vào các hàm hiện có nhằm tăng khả năng sử dụng lại chỉ bằng một vài dòng mã. Trong bài viết này, chúng ta sẽ khám phá 8 trình trang trí Python tích hợp có thể giúp bạn viết mã trang nhã hơn và dễ bảo trì hơn.

 

8 trình trang trí Python tích hợp để viết mã trang nhã
Hình ảnh của Editor

Sản phẩm @atexit.register trang trí được sử dụng để đăng ký một hàm sẽ được thực thi khi kết thúc chương trình. Chức năng này có thể được sử dụng để thực hiện bất kỳ tác vụ nào khi chương trình sắp thoát, cho dù đó là do thực thi bình thường hay do lỗi không mong muốn.

Ví dụ:

import atexit

# Register the exit_handler function
@atexit.register
def exit_handler():
    print("Exiting the program. Cleanup tasks can be performed here.")

# Rest of the program
def main():
    print("Inside the main function.")
    # Your program logic goes here.

if __name__ == "__main__":
    main()

Đầu ra:

Inside the main function.
Exiting the program. Cleanup tasks can be performed here.

 

Trong cách thực hiện trên, @atexit.register được đề cập ở trên định nghĩa hàm. Nó định nghĩa exit_handler() hoạt động như một chức năng thoát. Về cơ bản, điều đó có nghĩa là bất cứ khi nào chương trình đạt đến điểm kết thúc, do thực hiện bình thường hoặc do một lỗi không mong muốn khiến chương trình thoát sớm, exit_handler() hàm sẽ được gọi.

Sản phẩm @dataclasses.dataclass là một trình trang trí mạnh mẽ được sử dụng để tự động tạo ra các phương thức đặc biệt phổ biến cho các lớp như “__init__”, “__repr__” và các lớp khác. Nó giúp bạn viết mã rõ ràng hơn, ngắn gọn hơn bằng cách loại bỏ nhu cầu viết các phương thức soạn sẵn để khởi tạo và so sánh các phiên bản của lớp của bạn. Nó cũng có thể giúp ngăn ngừa lỗi bằng cách đảm bảo rằng các phương pháp đặc biệt phổ biến được triển khai nhất quán trên toàn bộ cơ sở mã của bạn.

Ví dụ:

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int


point = Point(x=3, y=2)
# Printing object
print(point)

# Checking for the equality of two objects
point1 = Point(x=1, y=2)
point2 = Point(x=1, y=2)
print(point1 == point2)

Đầu ra:

Point(x=3, y=2)
True

 

Sản phẩm @dataclass trình trang trí, được áp dụng phía trên định nghĩa lớp Point, báo hiệu cho Python sử dụng hành vi mặc định để tạo ra các phương thức đặc biệt. Điều này tự động tạo ra __init__ phương thức khởi tạo các thuộc tính lớp, chẳng hạn như x và y, khi khởi tạo đối tượng. Kết quả là, các trường hợp như điểm có thể được xây dựng mà không cần mã hóa rõ ràng. Hơn nữa, __repr__ phương thức, chịu trách nhiệm cung cấp một chuỗi biểu diễn các đối tượng, cũng được điều chỉnh tự động. Điều này đảm bảo rằng khi một đối tượng, chẳng hạn như một điểm, được in ra, nó sẽ mang lại một biểu diễn rõ ràng và có thứ tự, như được thấy trong kết quả đầu ra: Point(x=3, y=2). Ngoài ra, so sánh đẳng thức (==) giữa hai trường hợp, point1 và point2, tạo ra True. Điều này rất đáng chú ý vì theo mặc định, Python kiểm tra tính bằng nhau dựa trên vị trí bộ nhớ. Tuy nhiên, trong ngữ cảnh của các đối tượng lớp dữ liệu, sự bình đẳng được xác định bởi dữ liệu chứa trong chúng. Điều này là do trình trang trí @dataclass tạo ra một __eq__ phương thức kiểm tra tính bằng nhau của dữ liệu có trong các đối tượng, thay vì kiểm tra cùng một vị trí bộ nhớ.

Sản phẩm @enum.unique công cụ trang trí, được tìm thấy trong mô-đun enum, được sử dụng để đảm bảo rằng các giá trị của tất cả các thành viên trong bảng liệt kê là duy nhất. Điều này giúp ngăn chặn việc vô tình tạo ra nhiều thành viên liệt kê có cùng giá trị, điều này có thể dẫn đến nhầm lẫn và sai sót. Nếu tìm thấy các giá trị trùng lặp, một Giá trịError được nuôi dưỡng.

Ví dụ:

from enum import Enum, unique

@unique
class VehicleType(Enum):
    CAR = 1
    TRUCK = 2
    MOTORCYCLE = 3
    BUS = 4

# Attempting to create an enumeration with a duplicate value will raise a ValueError
try:
    @unique
    class DuplicateVehicleType(Enum):
        CAR = 1
        TRUCK = 2
        MOTORCYCLE = 3
        # BUS and MOTORCYCLE have duplicate values
        BUS = 3
except ValueError as e:
    print(f"Error: {e}")

 

Đầu ra:

Error: duplicate values found in : BUS -> MOTORCYCLE

 

Trong cách triển khai ở trên, “BUS” và “MOTORCYCLE” có cùng giá trị “3”. Kết quả là, @unique trình trang trí đưa ra ValueError kèm theo thông báo cho biết đã tìm thấy các giá trị trùng lặp. Bạn không thể sử dụng cùng một khóa nhiều lần và cũng không thể gán cùng một giá trị cho các thành viên khác nhau. Bằng cách này, nó giúp ngăn chặn các giá trị trùng lặp cho nhiều thành viên liệt kê.

Sản phẩm partial công cụ trang trí là một công cụ mạnh mẽ được sử dụng để tạo các chức năng một phần. Hàm một phần cho phép bạn đặt trước một số đối số của hàm ban đầu và tạo một hàm mới với các đối số đã được điền vào.

Ví dụ:

from functools import partial

# Original function
def power(base, exponent):
    return base ** exponent

# Creating a partial function with the exponent fixed to 2
square = partial(power, exponent=2)

# Using the partial function
result = square(3)
print("Output:",result)

 

Đầu ra:

 

Trong cách triển khai ở trên, chúng ta có một hàm “lũy thừa” chấp nhận hai đối số “cơ số” và “số mũ” và trả về kết quả của cơ số được nâng lên lũy thừa của số mũ. Chúng ta đã tạo một hàm riêng có tên là “vuông” bằng cách sử dụng hàm ban đầu trong đó số mũ được đặt trước thành 2. Bằng cách này, chúng ta có thể mở rộng chức năng của các hàm ban đầu bằng cách sử dụng một partial người trang trí.

Sản phẩm @singledisptach trang trí được sử dụng để tạo ra các chức năng chung. Nó cho phép bạn xác định các cách triển khai khác nhau của các hàm có cùng tên nhưng có kiểu đối số khác nhau. Nó đặc biệt hữu ích khi bạn muốn mã của mình hoạt động khác nhau đối với các loại dữ liệu khác nhau.

Ví dụ:

from functools import singledispatch

# Decorator
@singledispatch
def display_info(arg):
    print(f"Generic: {arg}")

# Registering specialized implementations for different types
@display_info.register(int)
def display_int(arg):
    print(f"Received an integer: {arg}")

@display_info.register(float)
def display_float(arg):
    print(f"Received a float: {arg}")

@display_info.register(str)
def display_str(arg):
    print(f"Received a string: {arg}")

@display_info.register(list)
def display_sequence(arg):
    print(f"Received a sequence: {arg}")

# Using the generic function with different types
display_info(39)             
display_info(3.19)          
display_info("Hello World!")
display_info([2, 4, 6])     

 

Đầu ra:

Received an integer: 39
Received a float: 3.19
Received a string: Hello World!
Received a sequence: [2, 4, 6]

 

Trong phần triển khai ở trên, trước tiên chúng tôi đã phát triển hàm chung display_info() bằng cách sử dụng @singledisptach trang trí và sau đó đăng ký triển khai riêng cho int, float, string và list. Đầu ra cho thấy hoạt động của display_info() cho các kiểu dữ liệu riêng biệt.

Sản phẩm @classmethod là một trình trang trí được sử dụng để định nghĩa các phương thức lớp trong lớp. Các phương thức lớp được liên kết với lớp chứ không phải đối tượng của lớp. Sự khác biệt chính giữa các phương thức tĩnh và các phương thức lớp nằm ở sự tương tác của chúng với trạng thái lớp. Các phương thức lớp có quyền truy cập và có thể sửa đổi trạng thái lớp, trong khi các phương thức tĩnh không thể truy cập trạng thái lớp và hoạt động độc lập.

Ví dụ:

class Student:
    total_students = 0

    def __init__(self, name, age):
        self.name = name
        self.age = age
        Student.total_students += 1

    @classmethod
    def increment_total_students(cls):
        cls.total_students += 1
        print(f"Class method called. Total students now: {cls.total_students}")

# Creating instances of the class
student1 = Student(name="Tom", age=20)
student2 = Student(name="Cruise", age=22)

# Calling the class method
Student.increment_total_students()  #Total students now: 3

# Accessing the class variable
print(f"Total students from student 1: {student1.total_students}")
print(f"Total students from student 2: {student2.total_students}")

 

Đầu ra:

Class method called. Total students now: 3
Total students from student 1: 3
Total students from student 2: 3

 

Trong cách thực hiện trên, Sinh viên lớp có tổng_sinh viên như một biến lớp. Các @classmethod trang trí được sử dụng để xác định increment_total_students() phương thức lớp để tăng tổng_sinh viên Biến đổi. Bất cứ khi nào chúng ta tạo một thể hiện của lớp Sinh viên, tổng số sinh viên sẽ tăng thêm một. Chúng tôi đã tạo hai phiên bản của lớp và sau đó sử dụng phương thức lớp để sửa đổi tổng_sinh viên biến thành 3, điều này cũng được phản ánh bởi các thể hiện của lớp.

Sản phẩm @staticmethod trang trí được sử dụng để xác định các phương thức tĩnh trong một lớp. Các phương thức tĩnh là các phương thức có thể được gọi mà không cần tạo một thể hiện của lớp. Các phương thức tĩnh thường được sử dụng khi chúng không phải truy cập các tham số liên quan đến đối tượng và liên quan nhiều hơn đến toàn bộ lớp.

Ví dụ:

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def subtract(x, y):
        return x - y

# Using the static methods without creating an instance of the class
sum_result = MathOperations.add(5, 4)
difference_result = MathOperations.subtract(8, 3)

print("Sum:", sum_result)            
print("Difference:", difference_result)

 

Đầu ra:

Sum: 9
Difference: 5

 

Trong việc thực hiện ở trên, chúng tôi đã sử dụng @staticmethod để định nghĩa một phương thức tĩnh add() cho lớp “MathOperations”. Chúng tôi đã thêm hai số “4” và “5” để có kết quả là “9” mà không tạo bất kỳ phiên bản nào của lớp. Tương tự, trừ hai số “8” và “3” được “5”. Bằng cách này, các phương thức tĩnh có thể được tạo ra để thực hiện các chức năng tiện ích không yêu cầu trạng thái của một thể hiện. 

Sản phẩm @property trình trang trí được sử dụng để xác định các phương thức getter cho thuộc tính lớp. Các phương thức getter là các phương thức trả về giá trị của một thuộc tính. Các phương thức này được sử dụng để đóng gói dữ liệu nhằm chỉ định ai có thể truy cập thông tin chi tiết của lớp hoặc phiên bản.

Ví dụ:

class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def radius(self):
        # Getter method for the radius.
        return self._radius

    @property
    def area(self):
        # Getter method for the area.
        return 3.14 * self._radius**2

# Creating an instance of the Circle class
my_circle = Circle(radius=5)

# Accessing properties using the @property decorator
print("Radius:", my_circle.radius)          
print("Area:", my_circle.area)  

 

Đầu ra:

Radius: 5
Area: 78.5

 

Trong cách triển khai ở trên, lớp “Circle” có thuộc tính “radius”. Chúng tôi vừa dùng @property để thiết lập các phương thức getter cho bán kính cũng như diện tích. Nó cung cấp một giao diện rõ ràng và nhất quán để người dùng của lớp truy cập các thuộc tính này. 

Bài viết này nêu bật một số công cụ trang trí linh hoạt và hữu dụng nhất mà bạn có thể sử dụng để làm cho mã của mình linh hoạt và dễ đọc hơn. Những trang trí này cho phép bạn mở rộng các chức năng của hàm ban đầu để làm cho nó có tổ chức hơn và ít xảy ra lỗi hơn. Chúng giống như những nét vẽ ma thuật giúp chương trình Python của bạn trông gọn gàng và hoạt động trơn tru.
 
 

Kanwal Mehreen là một nhà phát triển phần mềm đầy tham vọng, rất quan tâm đến khoa học dữ liệu và các ứng dụng của AI trong y học. Kanwal đã được chọn là Google Generation Scholar 2022 cho khu vực APAC. Kanwal thích chia sẻ kiến ​​thức kỹ thuật bằng cách viết các bài báo về các chủ đề thịnh hành và đam mê cải thiện sự đại diện của phụ nữ trong ngành công nghệ.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img