Cấu trúc mã Python

Python khác với các ngôn ngữ như C# hoặc Java ở chỗ chúng buộc bạn phải có các lớp được đặt tên theo tệp chứa chúng

Cho đến nay Python là một trong những ngôn ngữ linh hoạt nhất mà tôi đã tiếp xúc và mọi thứ quá linh hoạt sẽ làm tăng khả năng đưa ra các quyết định tồi

  • Bạn có muốn giữ tất cả các lớp dự án trong một tệp
    non_recommended_project
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    ├── .gitignore
    │
    ├── tests/*
    │    └── many_tests.py
    │
    ├── pyproject.toml
    │
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    └── README.md
    
    8 không?
  • Bạn có cần đọc var môi trường os không?
  • Bạn có cần sửa đổi hành vi chức năng không? . ?

Nhiều quyết định dễ thực hiện có thể phản tác dụng khi sản xuất mã cực kỳ khó bảo trì

Điều này không nhất thiết là xấu nếu bạn biết mình đang làm gì

Trong chương này, tôi sẽ trình bày cho bạn những nguyên tắc đã giúp ích cho tôi trong quá khứ khi làm việc ở các công ty khác nhau và với nhiều người khác nhau.

🌳 Cấu trúc dự án Python của bạn

Trước tiên hãy tập trung vào cấu trúc thư mục, đặt tên tệp và tổ chức mô-đun

Tôi khuyên bạn nên giữ tất cả các tệp mô-đun của mình bên trong thư mục

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
9 và tất cả các bài kiểm tra đều nằm cạnh nó

Dự án cấp cao nhất


├── src
│   ├── /*
│   │    ├── __init__.py
│   │    └── many_files.py
│   │
│   └── tests/*
│        └── many_tests.py
│
├── .gitignore
├── pyproject.toml
└── README.md

Trong đó

gmaps_crawler
├── src
│   └── gmaps_crawler
│        ├── __init__.py
│        ├── config.py 👈 [Singular]
│        ├── drivers.py
│        ├── entities.py
│        ├── exceptions.py
│        ├── facades.py
│        ├── main.py  👈 [Singular]
│        └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md
0 là mô-đun chính của bạn. Nếu nghi ngờ, hãy cân nhắc xem mọi người sẽ
gmaps_crawler
├── src
│   └── gmaps_crawler
│        ├── __init__.py
│        ├── config.py 👈 [Singular]
│        ├── drivers.py
│        ├── entities.py
│        ├── exceptions.py
│        ├── facades.py
│        ├── main.py  👈 [Singular]
│        └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md
1 như thế nào và bạn muốn
gmaps_crawler
├── src
│   └── gmaps_crawler
│        ├── __init__.py
│        ├── config.py 👈 [Singular]
│        ├── drivers.py
│        ├── entities.py
│        ├── exceptions.py
│        ├── facades.py
│        ├── main.py  👈 [Singular]
│        └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md
2 như thế nào

Thường thì nó có cùng tên với dự án hàng đầu. Đây không phải là một quy tắc mặc dù

🎯 Lý do đằng sau một thư mục
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
9

Tôi đã thấy nhiều dự án làm khác đi

Một số biến thể bao gồm không có thư mục

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
9 với tất cả các mô-đun dự án xung quanh cây

Điều này khá khó chịu vì thiếu trật tự, tạo ra những thứ như [ví dụ]

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md

Thật nhàm chán khi có những thứ quá xa nhau do cách sắp xếp theo thứ tự bảng chữ cái của IDE

Lý do chính đằng sau thư mục

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
9 là để giữ cho mã dự án đang hoạt động được tập trung bên trong một thư mục duy nhất trong khi cài đặt, thiết lập CI/CD và siêu dữ liệu dự án có thể nằm bên ngoài thư mục đó

Hạn chế duy nhất khi làm điều đó là bạn không thể

gmaps_crawler
├── src
│   └── gmaps_crawler
│        ├── __init__.py
│        ├── config.py 👈 [Singular]
│        ├── drivers.py
│        ├── entities.py
│        ├── exceptions.py
│        ├── facades.py
│        ├── main.py  👈 [Singular]
│        └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md
6 trong mã python của mình ngay lập tức. Chúng tôi cần thiết lập dự án để được cài đặt trong kho lưu trữ này. Chúng ta sẽ sớm thảo luận về cách giải quyết vấn đề này trong chương này

🏷️ Cách đặt tên file

Quy tắc 1. không có tập tin

Trước hết, trong Python không có những thứ như "tệp" và tôi nhận thấy đây là nguồn gây nhầm lẫn chính cho người mới bắt đầu

Nếu bạn đang ở trong một thư mục chứa bất kỳ

gmaps_crawler
├── src
│   └── gmaps_crawler
│        ├── __init__.py
│        ├── config.py 👈 [Singular]
│        ├── drivers.py
│        ├── entities.py
│        ├── exceptions.py
│        ├── facades.py
│        ├── main.py  👈 [Singular]
│        └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md
7 nào thì đó là thư mục bao gồm các mô-đun, không phải tệp

Xem mỗi mô-đun dưới dạng một không gian tên

Ý tôi là không gian tên bởi vì bạn không thể nói chắc liệu chúng có nhiều hàm, lớp hay chỉ là hằng số. Nó có thể có hầu như tất cả hoặc chỉ một số ít

Quy tắc 2. Giữ mọi thứ lại với nhau khi cần thiết

Thật tốt khi có nhiều lớp trong một mô-đun duy nhất và bạn nên làm như vậy. [khi các lớp có liên quan đến mô-đun, rõ ràng. ]

Chỉ chia nhỏ nó khi mô-đun của bạn quá lớn hoặc khi nó xử lý các mối quan tâm khác nhau

Thông thường, mọi người nghĩ rằng đó là một cách làm không tốt do một số kinh nghiệm với các ngôn ngữ khác thực thi theo cách khác [e. g. Java và C#]

Quy tắc 3. Theo mặc định, đặt tên số nhiều

Theo nguyên tắc thông thường, hãy đặt tên cho các mô-đun của bạn ở số nhiều và đặt tên theo ngữ cảnh kinh doanh

Có những ngoại lệ đối với quy tắc này mặc dù. Các mô-đun có thể được đặt tên là

gmaps_crawler
├── src
│   └── gmaps_crawler
│        ├── __init__.py
│        ├── config.py 👈 [Singular]
│        ├── drivers.py
│        ├── entities.py
│        ├── exceptions.py
│        ├── facades.py
│        ├── main.py  👈 [Singular]
│        └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md
8,
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
8 và tương tự như đại diện cho một thứ duy nhất. Sử dụng phán đoán của bạn, nếu nghi ngờ hãy tuân theo quy tắc số nhiều

🔎 Ví dụ thực tế khi đặt tên module

Tôi sẽ chia sẻ dự án Google Maps Crawler mà tôi đã xây dựng để làm ví dụ

Dự án này chịu trách nhiệm thu thập dữ liệu từ Google Maps bằng Selenium và xuất nó [Đọc thêm tại đây nếu tò mò]

Đây là cây dự án hiện tại phác thảo các ngoại lệ đối với quy tắc số 3

gmaps_crawler
├── src
│   └── gmaps_crawler
│        ├── __init__.py
│        ├── config.py 👈 [Singular]
│        ├── drivers.py
│        ├── entities.py
│        ├── exceptions.py
│        ├── facades.py
│        ├── main.py  👈 [Singular]
│        └── storages.py
│
├── .gitignore
├── pyproject.toml
└── README.md

Có vẻ như rất tự nhiên khi nhập các lớp và hàm như

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
5

Tôi có thể hiểu rằng tôi có thể có một hoặc nhiều lớp ngoại lệ bên trong

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
50, v.v.

Vẻ đẹp của việc có nhiều mô-đun là

  • Chúng không quá nhỏ [e. g. mỗi lớp một]
  • Bất cứ lúc nào bạn cũng có thể chia nó thành các mô-đun nhỏ hơn nếu cần
  • Chúng mang lại cho bạn cảm giác mạnh mẽ khi biết những gì có thể tồn tại bên trong

🔖 Đặt tên lớp, hàm và biến

Một số người cho rằng việc đặt tên thật khó. Nó trở nên ít khó khăn hơn khi bạn xác định một số nguyên tắc

👊 Hàm và Phương thức phải là động từ

Hàm và phương thức đại diện cho một hành động hoặc nội dung có thể thực hiện được

Một cái gì đó "không". Có điều gì đó đang diễn ra"

Hành động được thể hiện rõ ràng bằng động từ

Một vài ví dụ điển hình từ các dự án THỰC SỰ mà tôi đã làm trước đây

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
7

Một vài ví dụ xấu

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
8

Họ hơi không rõ liệu họ trả lại một đối tượng để cho phép tôi thực hiện lệnh gọi API hay nếu nó thực sự gửi email chẳng hạn

Tôi có thể hình dung một kịch bản như thế này

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
9Ví dụ về tên hàm gây hiểu nhầm

Ngoại lệ đối với quy tắc này chỉ là một vài nhưng chúng tồn tại

  • Tạo một hàm
    non_recommended_project
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    ├── .gitignore
    │
    ├── tests/*
    │    └── many_tests.py
    │
    ├── pyproject.toml
    │
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    └── README.md
    
    51 để được gọi trong điểm nhập chính của ứng dụng của bạn là một lý do chính đáng để bỏ qua quy tắc này
  • Sử dụng
    non_recommended_project
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    ├── .gitignore
    │
    ├── tests/*
    │    └── many_tests.py
    │
    ├── pyproject.toml
    │
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    └── README.md
    
    52 để coi phương thức lớp là thuộc tính cũng hợp lệ

🐶 Biến và hằng nên là danh từ

Phải luôn là danh từ, không bao giờ là động từ [làm rõ sự khác biệt giữa các chức năng]

ví dụ tốt


├── src
│   ├── /*
│   │    ├── __init__.py
│   │    └── many_files.py
│   │
│   └── tests/*
│        └── many_tests.py
│
├── .gitignore
├── pyproject.toml
└── README.md
2

ví dụ xấu


├── src
│   ├── /*
│   │    ├── __init__.py
│   │    └── many_files.py
│   │
│   └── tests/*
│        └── many_tests.py
│
├── .gitignore
├── pyproject.toml
└── README.md
3

Nếu biến/hằng số của bạn là một danh sách hoặc tập hợp, hãy đặt nó ở dạng số nhiều


├── src
│   ├── /*
│   │    ├── __init__.py
│   │    └── many_files.py
│   │
│   └── tests/*
│        └── many_tests.py
│
├── .gitignore
├── pyproject.toml
└── README.md
4

🏛️ Các lớp học nên tự giải thích, nhưng các Hậu tố cũng được

Thích các lớp có tên tự giải thích. Bạn có thể sử dụng các hậu tố như

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
53,
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
54,
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
55, nhưng chỉ khi thực sự cần thiết để làm rõ mục đích của nó

Luôn đặt tên nó ở số ít thay vì số nhiều. Số nhiều nhắc nhở chúng ta về các bộ sưu tập [e. g. nếu tôi đọc

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
56, tôi cho rằng đó là một danh sách hoặc có thể lặp lại], vì vậy hãy nhắc nhở bản thân rằng một khi một lớp được khởi tạo, nó sẽ trở thành một đối tượng duy nhất

Các lớp đại diện cho các thực thể

Các lớp đại diện cho những thứ từ bối cảnh kinh doanh nên được đặt tên như vậy [danh từ. ]. Như _______ 157, ________ 158, ________ 159, ________ 170, v.v.

Ví dụ về cách sử dụng hậu tố

Giả sử bạn muốn tạo một lớp chịu trách nhiệm gửi email. Nếu bạn đặt tên nó chỉ là "

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
71", mục đích của nó không rõ ràng

Ai đó có thể nghĩ rằng nó có thể đại diện cho một thực thể e. g

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
0

Bạn nên đặt tên là "

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
72" hoặc "
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
73"

🐪 Quy ước về vỏ bọc

Theo mặc định, hãy tuân theo các quy ước đặt tên này

LoạiPublicInternalGói [thư mục]
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
74-Mô-đun [tệp]
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
75-Lớp
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
76-Chức năng và phương pháp
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
77
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
78Hằng số
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
79
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
80

⚠️ Tuyên bố miễn trừ trách nhiệm về các phương pháp """riêng tư"""

Một số người phát hiện ra rằng nếu bạn có

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
81 [bất kỳ phương thức nào bắt đầu bằng hai dấu gạch dưới] thì Python sẽ không cho phép các lớp/phương thức bên ngoài gọi nó bình thường, điều này khiến họ nghĩ rằng nó ổn

Nếu bạn đến từ môi trường C# như tôi thì nghe có vẻ lạ khi bạn không thể bảo vệ một phương thức

Nhưng Guido [tác giả của Python] có lý do chính đáng đằng sau nó

"Tất cả chúng ta đều là người lớn đồng ý ở đây"

Điều đó có nghĩa là nếu bạn biết rằng bạn không nên gọi một phương thức, thì bạn không nên gọi trừ khi bạn biết mình đang làm gì

Rốt cuộc, nếu bạn thực sự quyết định gọi phương thức đó, bạn sẽ làm điều gì đó bẩn thỉu để biến nó thành hiện thực [được gọi là "Phản chiếu" trong C#]

Đánh dấu phương thức/chức năng riêng tư của bạn bằng một dấu gạch dưới ban đầu để nói rằng nó chỉ dành cho mục đích sử dụng riêng tư và sống với nó

↪️ Khi nào thì tạo hàm hoặc lớp trong Python?

Đây là một câu hỏi phổ biến tôi đã nhận được một vài lần

Nếu bạn làm theo các đề xuất trên, bạn sẽ có các mô-đun rõ ràng và các mô-đun rõ ràng là một cách hiệu quả để tổ chức các chức năng

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
1

Đôi khi bạn có thể xác định các tập hợp con của các chức năng bên trong một mô-đun. Khi điều này xảy ra, một lớp học có ý nghĩa hơn

Ví dụ về nhóm các tập con khác nhau của hàm

Xem xét mô-đun

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
82 tương tự với 4 chức năng

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
2

S3 là kho lưu trữ đám mây để lưu trữ bất kỳ loại dữ liệu nào do Amazon [AWS] cung cấp. Nó giống như Google Drive cho phần mềm

Chúng ta có thể nói về điều đó

  • Nhà phát triển có thể lưu dữ liệu ở chế độ GỠ LỖI [chỉ in ra màn hình] hoặc trên S3 [lưu trữ dữ liệu trên đám mây]
  • non_recommended_project
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    ├── .gitignore
    │
    ├── tests/*
    │    └── many_tests.py
    │
    ├── pyproject.toml
    │
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    └── README.md
    
    83 sử dụng hàm
    non_recommended_project
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    ├── .gitignore
    │
    ├── tests/*
    │    └── many_tests.py
    │
    ├── pyproject.toml
    │
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    └── README.md
    
    84
  • non_recommended_project
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    ├── .gitignore
    │
    ├── tests/*
    │    └── many_tests.py
    │
    ├── pyproject.toml
    │
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    └── README.md
    
    85 sử dụng hàm
    non_recommended_project
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    ├── .gitignore
    │
    ├── tests/*
    │    └── many_tests.py
    │
    ├── pyproject.toml
    │
    ├── /*
    │     ├── __init__.py
    │     └── many_files.py
    │
    └── README.md
    
    86

Tôi có thể thấy hai nhóm chức năng và không có lý do gì để giữ chúng trong các mô-đun khác nhau vì chúng có vẻ nhỏ, vì vậy tôi rất thích được định nghĩa chúng là các lớp

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
3

Đây là một quy tắc của ngón tay cái

  • Luôn bắt đầu với các chức năng
  • Phát triển thành các lớp khi bạn cảm thấy mình có thể nhóm các tập hợp con khác nhau của các chức năng

🚪 Tạo mô-đun và điểm vào

Mỗi ứng dụng có một điểm vào

Điều đó có nghĩa là có một mô-đun duy nhất [còn gọi là tệp] chạy ứng dụng của bạn. Nó có thể là một tập lệnh đơn lẻ hoặc một mô-đun lớn

Bất cứ khi nào bạn đang tạo một điểm vào, hãy đảm bảo thêm một điều kiện để đảm bảo rằng nó đang được thực thi và không được nhập

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
4

Bằng cách đó, bạn đảm bảo rằng mọi lần nhập sẽ không vô tình kích hoạt mã của bạn. Trừ khi nó được thực thi rõ ràng

Xác định chính cho các mô-đun

Bạn có thể đã nhận thấy một số gói python có thể được gọi bằng cách chuyển xuống

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
87 như

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
5

Các gói như vậy được xử lý gần giống như các lệnh thông thường vì bạn cũng có thể chạy chúng dưới dạng

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
6

Để thực hiện điều này, bạn cần chỉ định một tệp

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
88 bên trong mô-đun chính của mình

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
7

Đừng quên bạn vẫn cần bao gồm séc

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
89 bên trong tệp
non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
88 của mình

Khi bạn cài đặt mô-đun của mình, bạn có thể chạy dự án của mình với tên

non_recommended_project
├── /*
│     ├── __init__.py
│     └── many_files.py
│
├── .gitignore
│
├── tests/*
│    └── many_tests.py
│
├── pyproject.toml
│
├── /*
│     ├── __init__.py
│     └── many_files.py
│
└── README.md
91

📖 Này

Đây là bản thảo đầu tiên từ một cuốn sách mà tôi đang viết

Nếu bạn quan tâm, hãy nhớ đăng ký nhận bản tin và theo dõi tôi trên Twitter để được thông báo khi sách ra mắt

Chương đầu tiên đã ra mắt với mức giảm giá đặc biệt

Python Like a PRO 🐍📚 Sách

⚠️📚 Cuốn sách này vẫn đang trong quá trình hoàn thiện [nên hiện tại nó rất rẻ, giá sẽ tăng khi tất cả các chương được xuất bản]. Bạn cần biết mình đang làm cái quái gì 🔥🐍Python là một trong những ngôn ngữ linh hoạt nhất mà tôi từng tiếp xúc. Mọi thứ quá linh hoạt sẽ nâng cao tỷ lệ thành công…

kẹo cao su

Tôi cũng sẵn sàng nhận phản hồi, hãy liên hệ qua email hoặc Twitter DM nếu bạn có bất kỳ

Chào bạn. Bạn đang tận hưởng những gì bạn đang đọc?

Mã Python nên được cấu trúc như thế nào?

Cách tốt để cấu trúc một Dự án Python .
Mẹo số 1. Tạo môi trường ảo
Mẹo số 2. Tạo một thư mục riêng cho các bài kiểm tra
Mẹo số 3. Tạo các thư mục nội dung khác nhau

Ba cấu trúc lập trình chính trong Python là gì?

Luồng điều khiển thông qua bất kỳ chương trình nào được thực hiện với ba loại cấu trúc điều khiển cơ bản. Trình tự, Lựa chọn và Lặp lại

Cú pháp mã trong Python là gì?

Cú pháp là một trong những yêu cầu cơ bản mà chúng ta phải biết để viết mã bằng bất kỳ ngôn ngữ nào . Trong Python, chúng tôi sử dụng thụt đầu dòng để thể hiện khối mã. Chúng ta phải tuân theo một số quy tắc về cách sử dụng dấu thụt đầu dòng. Không chỉ thụt đầu dòng, chúng ta phải tuân theo các quy tắc về cách chọn tên cho các biến.

Kiến trúc của Python là gì?

Python là một ngôn ngữ lập trình hướng đối tượng giống như Java. Python được gọi là ngôn ngữ thông dịch. Python sử dụng các mô-đun mã có thể hoán đổi cho nhau thay vì một danh sách dài các hướng dẫn là tiêu chuẩn cho các ngôn ngữ lập trình chức năng. Việc triển khai tiêu chuẩn của python được gọi là “cpython”.

Chủ Đề