Các bài viết

Python và các phương thức nâng cao, các hàm nhỏ hơn để lập trình tốt hơn

Python là một ngôn ngữ lập trình tuyệt vời và được chứng minh bằng GitHub, cũng là ngôn ngữ phổ biến thứ hai vào năm 2022.

Ưu điểm thú vị nhất của Python là cộng đồng lập trình viên đông đảo.

Có vẻ như Python có gói dành cho mọi trường hợp sử dụng.

Trong thế giới lập trình Python rộng lớn, có một tập hợp các tính năng thường không được người mới bắt đầu chú ý, nhưng lại có tầm quan trọng đáng kể trong hệ sinh thái của ngôn ngữ này.

Phương pháp ma thuật là một tập hợp các phương pháp trướcdefinites trong Python cung cấp các tính năng cú pháp đặc biệt. Chúng dễ dàng được nhận ra bởi dấu gạch ngang kép ở đầu và cuối, như __init__, __call__, __len__ … vân vân.

Phương pháp kỳ diệu

Các phương thức ma thuật cho phép các đối tượng tùy chỉnh hoạt động tương tự như các loại Python tích hợp.

Trong bài viết này, chúng tôi sẽ tập trung vào các hàm dunder mạnh mẽ. Chúng tôi sẽ khám phá mục đích của họ và thảo luận về việc sử dụng chúng.

Cho dù bạn là người mới sử dụng Python hay một lập trình viên có kinh nghiệm, bài viết này nhằm mục đích cung cấp cho bạn sự hiểu biết toàn diện về các hàm Dunder, giúp trải nghiệm mã hóa Python của bạn hiệu quả và thú vị hơn.

Hãy nhớ rằng, điều kỳ diệu của Python không chỉ nằm ở sự đơn giản và tính linh hoạt của nó mà còn ở các tính năng mạnh mẽ của nó như các hàm Dunder.

__trong đó__

Có lẽ chức năng dunder cơ bản nhất của tất cả. Đây là phương thức kỳ diệu mà Python tự động gọi bất cứ khi nào chúng ta tạo (hoặc như tên gợi ý, khởi tạo) một đối tượng mới.__init__

lớp Pizza:
def __init__(bản thân, kích thước, lớp phủ):
self.size = kích thước
self.toppings = lớp trên bề mặt

# Bây giờ hãy tạo một chiếc bánh pizza
my_pizza = Pizza('lớn', ['pepperoni', 'nấm'])

print(my_pizza.size) # Điều này sẽ in: lớn
print(my_pizza.toppings) # Điều này sẽ in ra: ['pepperoni', 'mushrooms']

Trong ví dụ này, một lớp có tên Pizza được tạo. Chúng tôi thiết lập hàm __init__ của mình để bao gồm các tham số được chỉ định tại thời điểm khởi tạo và đặt chúng làm thuộc tính cho đối tượng tùy chỉnh của chúng tôi.

Ở đây, nó được sử dụng để đại diện cho thể hiện của lớp. Vì vậy, khi chúng ta viết self.size = size, chúng ta đang nói, "Này, đối tượng pizza này có thuộc tính size sizevà tôi muốn nó có kích thước bất kỳ mà tôi đã cung cấp khi tạo đối tượng”.

__str__ và __repr__

__Str__

Đây là phương pháp kỳ diệu của Python cho phép chúng ta defihoàn thành một mô tả cho mục tùy chỉnh của chúng tôi.

Khi bạn in một đối tượng hoặc chuyển đổi nó thành một chuỗi bằng cách sử dụng str(), Python kiểm tra xem bạn có defiTôi đã nghĩ ra một phương pháp __str__ cho lớp của đối tượng đó.

Nếu vậy, hãy sử dụng phương thức đó để chuyển đổi đối tượng thành một chuỗi.

Chúng ta có thể mở rộng ví dụ Pizza của mình để bao gồm một chức năng __str__ như sau:

lớp Pizza: def __init__(self, size, toppings): self.size = size self.toppings = toppings def __str__(self): trả về f"A {self.size} pizza với {', '.join(self.toppings )}" my_pizza = Pizza('large', ['pepperoni', 'mushrooms']) print(my_pizza) # Điều này sẽ in: Một chiếc bánh pizza lớn với pepperoni, nấm
__repr__

Hàm __str__ là một cách không chính thức để mô tả các thuộc tính của một đối tượng. Mặt khác, __repr__ được sử dụng để cung cấp mô tả chính thức, chi tiết và rõ ràng hơn về đối tượng tùy chỉnh.

Nếu bạn gọi repr() trên một đối tượng hoặc bạn chỉ cần gõ tên đối tượng vào bảng điều khiển, Python sẽ tìm một phương thức __repr__.

Se __str__ không phải vậy defitối nay, Python sẽ sử dụng __repr__ như một bản sao lưu khi cố gắng in đối tượng hoặc chuyển đổi nó thành một chuỗi. Vì vậy, nó thường là một ý tưởng tốt defihoàn thành ít nhất __repr__, ngay cả khi bạn không deficháu gái __str__.

Đây là cách chúng ta có thể defiđêm __repr__ cho ví dụ pizza của chúng tôi:

lớp Pizza:
def __init__(bản thân, kích thước, lớp phủ):
self.size = kích thước
self.toppings = lớp trên bề mặt

def __repr__(bản thân):
return f"Pizza('{self.size}', {self.toppings})"

my_pizza = Pizza('lớn', ['pepperoni', 'nấm'])
print(repr(my_pizza)) # Điều này sẽ in ra: Pizza('large', ['pepperoni', 'mushrooms'])

__repr__ cung cấp cho bạn một chuỗi mà bạn có thể chạy dưới dạng lệnh Python để tạo lại đối tượng pizza, trong khi __str__ cung cấp cho bạn một mô tả con người hơn. Tôi hy vọng nó sẽ giúp bạn nhai những phương pháp này tốt hơn một chút!

__cộng__

Trong Python, chúng ta đều biết rằng có thể cộng các số bằng toán tử +, Như 3 + 5.

Nhưng nếu chúng ta muốn thêm các phiên bản của một số đối tượng tùy chỉnh thì sao?

chức năng dunder __add__ nó cho phép chúng tôi làm điều đó. Nó cho chúng ta khả năng defikết thúc hành vi của nhà điều hành + trên các mặt hàng được cá nhân hóa của chúng tôi.

Vì lợi ích của tính nhất quán, giả sử chúng ta muốn defikết thúc hành vi của + trên ví dụ bánh pizza của chúng tôi. Giả sử rằng bất cứ khi nào chúng ta thêm hai hoặc nhiều bánh pizza lại với nhau, nó sẽ tự động kết hợp tất cả lớp phủ bên trên của chúng. Đây là những gì nó có thể trông giống như:

lớp Pizza:
def __init__(bản thân, kích thước, lớp phủ):
self.size = kích thước
self.toppings = lớp trên bề mặt

def __add__(bản thân, khác):
nếu không phải là ví dụ (khác, Pizza):
tăng TypeError("Bạn chỉ có thể thêm một Pizza khác!")
new_toppings = self.toppings + other.toppings
trả lại Pizza(self.size, new_toppings)

# Hãy tạo hai chiếc bánh pizza
pizza1 = Pizza('lớn', ['pepperoni', 'nấm'])
pizza2 = Pizza('lớn', ['ô liu', 'dứa'])

# Và bây giờ hãy "thêm" chúng
kết hợp_pizza = pizza1 + pizza2

print(combined_pizza.toppings) # Điều này sẽ in: ['pepperoni', 'nấm', 'ô liu', 'dứa']

Tương tự như dunder __add__, chúng ta cũng có thể defihoàn thành các chức năng số học khác như __sub__ (bằng phép trừ sử dụng toán tử -) Và __mul__ (đối với phép nhân sử dụng toán tử *).

__len__

Phương pháp dunder này cho phép chúng ta defikết thúc chức năng gì len() phải trả lại cho các mặt hàng tùy chỉnh của chúng tôi.

Python sử dụng len() để lấy độ dài hoặc kích thước của cấu trúc dữ liệu chẳng hạn như danh sách hoặc chuỗi.

Trong bối cảnh ví dụ của chúng tôi, chúng tôi có thể nói rằng "chiều dài" của một chiếc bánh pizza là số lượng lớp trên bề mặt mà nó có. Đây là cách chúng ta có thể thực hiện nó:

lớp Pizza:
def __init__(bản thân, kích thước, lớp phủ):
self.size = kích thước
self.toppings = lớp trên bề mặt

def __len__(bản thân):
trả lại len(self.toppings)

# Hãy tạo một chiếc bánh pizza
my_pizza = Pizza('lớn', ['pepperoni', 'nấm', 'ô liu'])

print(len(my_pizza)) # Điều này sẽ in: 3

Trong phương thức __len__, chúng tôi chỉ trả về độ dài của danh sách toppings. Hiện nay, len(my_pizza) nó sẽ cho chúng tôi biết có bao nhiêu toppings trên đó my_pizza.

__ quá trình __

Phương thức dunder này cho phép các đối tượng có thể lặp lại, tức là nó có thể được sử dụng trong vòng lặp for.

Để làm được điều này, chúng ta cũng phải defikết thúc chức năng __next__, Điều này được sử dụng cho defikết thúc hành vi sẽ trả về giá trị tiếp theo trong lần lặp. Nó cũng sẽ báo hiệu khả năng lặp lại trong trường hợp không có thêm phần tử nào trong chuỗi. Chúng tôi thường đạt được điều này bằng cách ném một ngoại lệ StopIteration.

Đối với ví dụ về bánh pizza của chúng tôi, giả sử chúng tôi muốn lặp lại lớp trên bề mặt. Chúng tôi có thể làm cho lớp Pizza của chúng tôi có thể lặp lại definendo một phương pháp __iter__:

lớp Pizza:
def __init__(bản thân, kích thước, lớp phủ):
self.size = kích thước
self.toppings = lớp trên bề mặt

def __iter__(bản thân):
tự.n = 0
trở lại bản thân

def __next__(bản thân):
nếu self.n < len(self.toppings):
kết quả = self.toppings[self.n]
tự.n += 1
trả về kết quả
khác:
tăng StopIteration

# Hãy tạo một chiếc bánh pizza
my_pizza = Pizza('lớn', ['pepperoni', 'nấm', 'ô liu'])

# Và bây giờ hãy lặp lại nó
cho topping trong my_pizza:
in (đứng đầu)

Trong trường hợp này, vòng lặp for gọi __iter__, khởi tạo một bộ đếm (self.n) và trả về chính đối tượng pizza (self).

Sau đó, vòng lặp for gọi __next__ để có được từng topping lần lượt.

khi nào __next__ trả lại tất cả các gia vị, StopIteration nó đưa ra một ngoại lệ và vòng lặp for bây giờ biết rằng không còn lớp phủ nào nữa và do đó sẽ hủy bỏ quá trình lặp.

Ercole Palmeri

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.
tags: mãng xà

Bài viết gần đây

Lợi ích của việc tô màu cho trẻ em - thế giới kỳ diệu dành cho mọi lứa tuổi

Phát triển kỹ năng vận động tinh thông qua tô màu giúp trẻ chuẩn bị cho những kỹ năng phức tạp hơn như viết. Để tô màu…

2 May 2024

Tương lai là đây: Ngành vận tải biển đang cách mạng hóa nền kinh tế toàn cầu như thế nào

Ngành hải quân là một cường quốc kinh tế toàn cầu thực sự, đang hướng tới thị trường 150 tỷ...

1 May 2024

Các nhà xuất bản và OpenAI ký thỏa thuận điều chỉnh luồng thông tin được Trí tuệ nhân tạo xử lý

Thứ Hai tuần trước, Financial Times đã công bố một thỏa thuận với OpenAI. FT cấp phép cho hoạt động báo chí đẳng cấp thế giới…

30 tháng tư 2024

Thanh toán trực tuyến: Đây là cách dịch vụ phát trực tuyến giúp bạn thanh toán mãi mãi

Hàng triệu người trả tiền cho các dịch vụ phát trực tuyến, trả phí thuê bao hàng tháng. Ý kiến ​​chung là bạn…

29 tháng tư 2024

Đọc Đổi mới bằng ngôn ngữ của bạn

Bản tin đổi mới
Đừng bỏ lỡ những tin tức quan trọng nhất về đổi mới. Đăng ký để nhận chúng qua email.

Theo chúng tôi