Hướng dẫn python class __init__ best practices - lớp python __init__ thực hành tốt nhất

Viết mã python có thể đọc và duy trì

Ảnh của Fab Lentz trên unplash

Nền tảng thiết yếu của Python như một ngôn ngữ lập trình hướng đối tượng là định nghĩa của các lớp liên quan để quản lý và xử lý dữ liệu trong các chương trình của bạn. Khi chúng tôi tạo các lớp của mình, phương pháp đầu tiên mà chúng tôi xác định là phương thức khởi tạo: __init__. Áp dụng các thực tiễn tốt nhất cho phương pháp này sẽ đảm bảo rằng người đọc dễ dàng hiểu được các đối tượng thể hiện của lớp. Trong bài viết này, tôi đã muốn xem xét các thực tiễn tốt nhất này để xác định phương pháp __init__.

1. Đặt nó ở trên cùng

Nghe có vẻ rõ ràng với hầu hết chúng ta, nhưng tôi đã thấy mọi người ẩn giấu nó sâu trong cơ thể của lớp, cùng với các thuộc tính khác. Nó rất quan trọng để đặt nó ở đầu lớp, trước bất kỳ phương pháp nào khác. Đây là nơi người đọc nên tìm phương pháp __init__.

Nếu bạn có thuộc tính lớp, bạn nên đặt phương thức __init__ sau các thuộc tính lớp này. Bạn phải thực hiện nó một cách nhất quán trên tất cả các lớp mà bạn xác định cho dự án của mình để độc giả giành được sự nhầm lẫn.

2. Đặt tên cho tham số đầu tiên là bản thân

Trước hết, bạn nên hiểu tham số đầu tiên có nghĩa là gì. Tham số đầu tiên đề cập đến đối tượng phiên bản gọi phương thức __init__. Bạn có thể đã nghe thấy thuật ngữ khởi tạo, nhưng phương thức __init__ không tương đương với việc khởi tạo. Như tên chỉ ra, __init__ có nghĩa là khởi tạo, đề cập đến quá trình thiết lập trạng thái ban đầu của đối tượng phiên bản mới được tạo.

Như một quy ước, nó rất quan trọng để bạn đặt tên cho tham số đầu tiên là bản thân, mặc dù nó không bắt buộc phải làm như vậy. Như một lưu ý phụ,

class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
0 không phải là một từ khóa trong Python, không giống như nhiều ngôn ngữ khác có thể sử dụng
class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
1,
class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
0 hoặc
class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
3 đóng vai trò là từ khóa dành riêng để chỉ đối tượng phiên bản gọi hiện tại.

3. Đặt tất cả các thuộc tính thể hiện

Python không hạn chế nơi bạn xác định các thuộc tính thể hiện trong lớp của bạn. Tuy nhiên, điều đó không có nghĩa là bạn có thể truyền bá các thuộc tính thể hiện ở mọi nơi trong lớp của bạn. Xem xét ví dụ sau:

Xác định các thuộc tính thể hiện

Như được hiển thị ở trên, chúng ta có thể tạo một thể hiện

class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
4 bằng cách khởi tạo tên của họ. Sau đó, chúng tôi có thể gọi
class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
5 để có được trạng thái đăng ký và
class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
6 để có được thông tin người bảo vệ sinh viên. Tuy nhiên, mô hình triển khai này không phải là mong muốn, bởi vì khi bạn truyền bá các thuộc tính thể hiện ở khắp mọi nơi, độc giả của mã của bạn đã giành được chắc chắn về những thuộc tính mà một thể hiện có. Thay vào đó, thực tiễn tốt nhất là đặt tất cả các thuộc tính thể hiện trong __init__ sao cho người đọc có thể biết những thể hiện thuộc tính nào có sự chắc chắn. Việc thực hiện sau đây áp dụng mẫu mong muốn:

Một nơi duy nhất thuộc tính

4. Tránh sử dụng ** kwargs

Trong Python,

class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
8 được sử dụng để chỉ ra số lượng tham số từ khóa khác nhau trong các định nghĩa chức năng. Do đó, nó chính xác về mặt cú pháp để bao gồm
class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
8 trong phương pháp __init__. Mặc dù phải có một số trường hợp nhất định sử dụng
class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
8 trong __init__ là hợp lệ, nhưng trong hầu hết các trường hợp, bạn không muốn sử dụng nó vì nó che giấu các tham số cần thiết để khởi tạo các trường hợp.

Tôi đoán rằng một lời biện minh chính cho việc sử dụng

class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects
8 của một số người là làm cho phương pháp __init__ trông sạch sẽ. Tuy nhiên, tôi tin rằng rõ ràng luôn tốt hơn tiềm ẩn. Mặc dù việc liệt kê tất cả các tham số trong đầu phương thức __init__ có thể trông rườm rà, nhưng chúng tôi đã rõ ràng về những tham số mà người dùng cần chỉ định khi chúng tạo đối tượng thể hiện.

5. Đặt các giá trị mặc định thích hợp

Nếu bạn biết những giá trị ban đầu sẽ được đặt thành một số thuộc tính nhất định, bạn có thể chỉ định chúng trong đầu __init__, do đó người dùng không cần đặt các tham số này khi chúng tạo các phiên bản. Ngoài ra, nếu một số giá trị nhất định được áp dụng cho hầu hết các kịch bản khởi tạo, bạn cũng có thể đặt các tham số này. Một ví dụ có thể được hiển thị dưới đây:

class Student:
def __init__(self, name, bus_rider=True):
self.name = name
self.bus_rider = bus_rider

Tuy nhiên, cần lưu ý rằng khi tham số là cấu trúc dữ liệu có thể thay đổi, bạn sẽ làm một cái gì đó khác biệt. Điều sau đây là sai:

class Student:
def __init__(self, name, subjects=["maths", "physics"]):
self.name = name
self.subjects = subjects

Vấn đề là khi bạn đặt

>>> student0 = Student("John")
>>> student0.subjects.append("music")
>>> student0.subjects
['maths', 'physics', 'music']
>>> student1 = Student("Ashley")
>>> student1.subjects
['maths', 'physics', 'music']
7 làm giá trị mặc định, đối tượng danh sách này được tạo ở định nghĩa hàm và sẽ được chia sẻ bởi tất cả các trường hợp. Mã sau đây cho bạn thấy vấn đề:shared by all instances. The following code shows you the problem:

>>> student0 = Student("John")
>>> student0.subjects.append("music")
>>> student0.subjects
['maths', 'physics', 'music']
>>> student1 = Student("Ashley")
>>> student1.subjects
['maths', 'physics', 'music']

6. Docstrings

Cũng giống như các phương pháp công khai khác, bạn nên có các tài liệu thích hợp cho phương pháp __init__. Mặc dù một số người thích ghi lại thông tin xây dựng ở cấp lớp (nghĩa là, đặt thông tin liên quan đến khởi tạo bên dưới đầu lớp), nhưng nó thường khuyến nghị bạn đặt các tài liệu ngay bên dưới phương pháp __init__.

Đối với mỗi tham số, bạn muốn chỉ định loại tham số - cho dù đó là một __init__0 hay __init__1. Theo thông tin này, bạn cung cấp một mô tả ngắn gọn về tham số này là gì hoặc nó làm gì. Nếu có giá trị mặc định, vui lòng chỉ định nó với bất kỳ biện minh/giải thích hiện hành nào.

Sự kết luận

Đây là danh sách các thực tiễn tốt nhất mà tôi đã theo dõi để xác định phương pháp __init__ cho các lớp trong Python. Cá nhân tôi thấy chúng hữu ích để duy trì khả năng đọc mã của tôi. Nếu bạn có bất cứ điều gì để thêm, xin vui lòng để lại nhận xét.

Cảm ơn vì đã đọc.

__ init __ có cần thiết trong Python không?

Ngày nay, một lập trình viên chắc chắn sẽ bắt gặp lập trình hướng đối tượng (OOP) trong sự nghiệp của họ. Là một ngôn ngữ lập trình hiện đại, Python cung cấp tất cả các phương tiện để thực hiện triết lý hướng đối tượng. Phương pháp __init__ là cốt lõi của OOP và được yêu cầu để tạo các đối tượng.The __init__ method is at the core of OOP and is required to create objects.

Tại sao __ init __ quan trọng?

__init__ là một trong những phương pháp dành riêng trong Python.Trong lập trình định hướng đối tượng, nó được gọi là một hàm tạo.Phương thức __init__ có thể được gọi khi một đối tượng được tạo từ lớp và cần truy cập để khởi tạo các thuộc tính của lớp.access is required to initialize the attributes of the class.

Cú pháp chính xác cho __ init __ là gì?

Chất cấu trúc mặc định __init__ Cú pháp để xác định hàm tạo __init__ mặc định như sau: class_name (): def __init __ (self): # Câu lệnh Constructor # Các phương thức lớp khácclass class_name(): def __init__(self): # Constructor statements # other class methods … …

Thực hành tốt nhất để khởi tạo là gì?

6 Thực tiễn tốt nhất để xác định phương pháp khởi tạo trong Python.Viết mã python có thể đọc và duy trì.....
Đặt nó ở đầu.....
Đặt tên cho tham số đầu tiên là bản thân.....
Đặt tất cả các thuộc tính thể hiện.....
Tránh sử dụng ** kwargs.....
Đặt các giá trị mặc định thích hợp.....
Docstrings..