Nếu bạn phát triển sự hiểu biết trực quan về sự khác biệt của chúng, bạn sẽ có thể viết Python hướng đối tượng để truyền đạt ý định của nó rõ ràng hơn và sẽ dễ bảo trì hơn trong thời gian dài Show
Tiền thưởng miễn phí. Nhấp vào đây để có quyền truy cập vào Bảng cheat Python OOP miễn phí chỉ cho bạn các hướng dẫn, video và sách hay nhất để tìm hiểu thêm về Lập trình hướng đối tượng với Python Các phương thức sơ thẩm, lớp và tĩnh - Tổng quanHãy bắt đầu bằng cách viết một lớp (Python 3) chứa các ví dụ đơn giản cho cả ba loại phương thức
Loại bỏ các quảng cáo Phương thức sơ thẩmPhương thức đầu tiên trên 9, được gọi là 0, là một phương thức thể hiện thông thường. Đó là loại phương thức cơ bản, không rườm rà mà bạn sẽ sử dụng hầu hết thời gian. Bạn có thể thấy phương thức nhận một tham số, 1, trỏ đến một thể hiện của 9 khi phương thức được gọi (nhưng tất nhiên, các phương thức thể hiện có thể chấp nhận nhiều hơn một tham số)Thông qua tham số 1, các phương thức thể hiện có thể tự do truy cập các thuộc tính và các phương thức khác trên cùng một đối tượng. Điều này mang lại cho họ rất nhiều sức mạnh khi sửa đổi trạng thái của một đối tượngKhông chỉ chúng có thể sửa đổi trạng thái đối tượng, các phương thức thể hiện còn có thể truy cập chính lớp đó thông qua thuộc tính 4. Điều này có nghĩa là các phương thức thể hiện cũng có thể sửa đổi trạng thái lớpphương pháp lớpHãy so sánh điều đó với phương pháp thứ hai, 5. Tôi đã đánh dấu phương thức này bằng một công cụ trang trí để đánh dấu nó là một phương thức của lớpThay vì chấp nhận một tham số 1, các phương thức lớp lấy một tham số 8 trỏ đến lớp—chứ không phải thể hiện của đối tượng—khi phương thức được gọiBởi vì phương thức lớp chỉ có quyền truy cập vào đối số 8 này, nên nó không thể sửa đổi trạng thái đối tượng. Điều đó sẽ yêu cầu quyền truy cập vào 1. Tuy nhiên, các phương thức lớp vẫn có thể sửa đổi trạng thái lớp áp dụng trên tất cả các phiên bản của lớpPhương thức tĩnhPhương thức thứ ba, 71 được đánh dấu bằng một trình trang trí để đánh dấu nó là một phương thức tĩnhLoại phương thức này không nhận tham số 1 hay 8 (nhưng tất nhiên nó có thể miễn phí chấp nhận một số tùy ý các tham số khác)Do đó, một phương thức tĩnh không thể sửa đổi trạng thái đối tượng cũng như trạng thái lớp. Các phương thức tĩnh bị hạn chế về loại dữ liệu mà chúng có thể truy cập - và chúng chủ yếu là một cách để tạo không gian tên cho các phương thức của bạn Hãy xem chúng hoạt độngTôi biết cuộc thảo luận này đã khá lý thuyết cho đến thời điểm này. Và tôi tin rằng điều quan trọng là bạn phải phát triển sự hiểu biết trực quan về sự khác biệt của các loại phương pháp này trong thực tế. Bây giờ chúng ta sẽ đi qua một số ví dụ cụ thể Chúng ta hãy xem các phương thức này hoạt động như thế nào khi chúng ta gọi chúng. Chúng ta sẽ bắt đầu bằng cách tạo một thể hiện của lớp và sau đó gọi ba phương thức khác nhau trên đó 9 được thiết lập theo cách mà mỗi lần triển khai của phương thức trả về một bộ chứa thông tin để chúng tôi theo dõi những gì đang diễn ra — và phần nào của lớp hoặc đối tượng mà phương thức có thể truy cậpĐây là những gì xảy ra khi chúng ta gọi một phương thức thể hiện >>>
Điều này xác nhận rằng 0 (phương thức thể hiện) có quyền truy cập vào thể hiện đối tượng (được in dưới dạng 77) thông qua đối số 1Khi phương thức được gọi, Python sẽ thay thế đối số 1 bằng đối tượng thể hiện, 60. Chúng ta có thể bỏ qua đường cú pháp của cú pháp gọi dấu chấm ( 61) và chuyển đối tượng thể hiện theo cách thủ công để nhận được kết quả tương tự>>>
Bạn có đoán được điều gì sẽ xảy ra nếu bạn cố gắng gọi phương thức mà không tạo một thể hiện trước không? Nhân tiện, các phương thức thể hiện cũng có thể truy cập chính lớp đó thông qua thuộc tính 4. Điều này làm cho các phương thức cá thể trở nên mạnh mẽ về mặt hạn chế truy cập - chúng có thể sửa đổi trạng thái trên cá thể đối tượng và trên chính lớp đóHãy thử phương thức lớp tiếp theo >>> 7Việc gọi 63 cho chúng ta thấy rằng nó không có quyền truy cập vào đối tượng 77 mà chỉ truy cập vào đối tượng 65, đại diện cho chính lớp đó (mọi thứ trong Python đều là đối tượng, ngay cả bản thân các lớp)Lưu ý cách Python tự động chuyển lớp làm đối số đầu tiên cho hàm khi chúng ta gọi 66. Gọi một phương thức trong Python thông qua cú pháp dấu chấm sẽ kích hoạt hành vi này. Tham số 1 trên các phương thức cá thể hoạt động theo cùng một cáchXin lưu ý rằng việc đặt tên cho các tham số này là 1 và 8 chỉ là một quy ước. Bạn có thể dễ dàng đặt tên cho chúng là 80 và 81 và nhận được kết quả tương tự. Tất cả những gì quan trọng là chúng được đặt ở vị trí đầu tiên trong danh sách tham số cho phương thứcĐã đến lúc gọi phương thức tĩnh ngay bây giờ >>> 6Bạn có thấy cách chúng tôi gọi 82 trên đối tượng và có thể thực hiện thành công không? Đằng sau hậu trường Python chỉ đơn giản thực thi các hạn chế truy cập bằng cách không chuyển vào đối số 1 hoặc 8 khi một phương thức tĩnh được gọi bằng cú pháp dấu chấmĐiều này xác nhận rằng các phương thức tĩnh không thể truy cập trạng thái đối tượng cũng như trạng thái lớp. Chúng hoạt động giống như các hàm thông thường nhưng thuộc về không gian tên của lớp (và của mọi cá thể) Bây giờ, hãy xem điều gì sẽ xảy ra khi chúng ta cố gắng gọi các phương thức này trên chính lớp đó - mà không tạo trước một thể hiện đối tượng >>> 8Chúng tôi có thể gọi 63 và 82 tốt, nhưng cố gắng gọi phương thức dụ 87 không thành công với một 88Và điều này được mong đợi — lần này chúng ta không tạo một thể hiện đối tượng và thử gọi một hàm thể hiện trực tiếp trên chính bản thiết kế của lớp. Điều này có nghĩa là không có cách nào để Python đưa vào đối số 1 và do đó lệnh gọi không thành côngĐiều này sẽ làm cho sự khác biệt giữa ba loại phương thức này rõ ràng hơn một chút. Nhưng tôi sẽ không để nó ở đó. Trong hai phần tiếp theo, tôi sẽ xem xét hai ví dụ thực tế hơn một chút về thời điểm sử dụng các loại phương thức đặc biệt này Tôi sẽ dựa trên các ví dụ của mình xung quanh lớp 00 cơ bản này 0>>> 2Loại bỏ các quảng cáo Nhà Máy Pizza Ngon Với >>> obj = MyClass() >>> obj.method() ('instance method called', <MyClass instance at 0x10205d190>) 5Nếu bạn đã từng tiếp xúc với pizza trong thế giới thực, bạn sẽ biết rằng có rất nhiều biến thể ngon miệng 6Người Ý đã tìm ra cách phân loại pizza của họ từ nhiều thế kỷ trước, và vì vậy những loại pizza thơm ngon này đều có tên riêng. Chúng tôi sẽ làm tốt để tận dụng điều đó và cung cấp cho người dùng lớp 00 của chúng tôi một giao diện tốt hơn để tạo các đối tượng bánh pizza mà họ khao khátMột cách hay và rõ ràng để làm điều đó là sử dụng các phương thức lớp làm hàm xuất xưởng cho các loại pizza khác nhau mà chúng ta có thể tạo 0Lưu ý cách tôi đang sử dụng đối số 8 trong các phương thức xuất xưởng của 05 và 06 thay vì gọi trực tiếp hàm tạo 00Đây là mẹo bạn có thể sử dụng để tuân theo nguyên tắc Không lặp lại chính mình (DRY). Nếu chúng ta quyết định đổi tên lớp này vào một lúc nào đó, chúng ta sẽ không phải nhớ việc cập nhật tên hàm tạo trong tất cả các hàm của nhà máy classmethod Bây giờ, chúng ta có thể làm gì với các phương thức xuất xưởng này? >>> 1Như bạn có thể thấy, chúng ta có thể sử dụng các hàm gốc để tạo các đối tượng 00 mới được định cấu hình theo cách chúng ta muốn. Tất cả đều sử dụng cùng một hàm tạo 09 trong nội bộ và chỉ cung cấp lối tắt để ghi nhớ tất cả các thành phần khác nhauMột cách khác để xem xét việc sử dụng các phương thức lớp này là chúng cho phép bạn định nghĩa các hàm tạo thay thế cho các lớp của bạn Python chỉ cho phép một phương thức 09 trên mỗi lớp. Sử dụng các phương thức của lớp, có thể thêm bao nhiêu hàm tạo thay thế nếu cần. Điều này có thể làm cho giao diện cho các lớp của bạn tự ghi lại (ở một mức độ nhất định) và đơn giản hóa việc sử dụng chúngKhi nào nên sử dụng các phương thức tĩnhKhó hơn một chút để đưa ra một ví dụ hay ở đây. Nhưng nói cho bạn biết, tôi sẽ tiếp tục kéo dài sự tương tự của chiếc bánh pizza ngày càng mỏng hơn… (yum. ) Đây là những gì tôi nghĩ ra 2Bây giờ tôi đã thay đổi những gì ở đây? Tôi cũng đã thêm một phương thức thực thể 23 để tính toán và trả về diện tích của chiếc bánh pizza (đây cũng là một ứng cử viên sáng giá cho một 24 — nhưng này, đây chỉ là một ví dụ đồ chơi thôi)Thay vì tính diện tích trực tiếp trong 23, sử dụng công thức diện tích hình tròn nổi tiếng, tôi đã tính toán diện tích đó cho một phương pháp tĩnh riêng của 26Hãy thử nó ra >>> 3Chắc chắn, đây là một ví dụ hơi đơn giản, nhưng nó sẽ giúp giải thích một số lợi ích mà các phương thức tĩnh mang lại. Như chúng ta đã biết, các phương thức tĩnh không thể truy cập lớp hoặc trạng thái cá thể vì chúng không nhận đối số 8 hoặc 1. Đó là một hạn chế lớn — nhưng đó cũng là một tín hiệu tuyệt vời cho thấy rằng một phương pháp cụ thể độc lập với mọi thứ khác xung quanh nóTrong ví dụ trên, rõ ràng là 26 không thể sửa đổi lớp hoặc thể hiện của lớp theo bất kỳ cách nào. (Chắc chắn rồi, bạn luôn có thể giải quyết vấn đề đó bằng một biến toàn cục nhưng đó không phải là vấn đề ở đây. )Bây giờ, tại sao điều đó lại hữu ích? Gắn cờ một phương thức là một phương thức tĩnh không chỉ là một gợi ý rằng một phương thức sẽ không sửa đổi trạng thái lớp hoặc thể hiện - hạn chế này cũng được thực thi bởi thời gian chạy Python Các kỹ thuật như vậy cho phép bạn giao tiếp rõ ràng về các phần của kiến trúc lớp của bạn để công việc phát triển mới được hướng dẫn diễn ra một cách tự nhiên trong các ranh giới đã đặt này. Tất nhiên, nó sẽ đủ dễ dàng để thách thức những hạn chế này. Nhưng trên thực tế, chúng thường giúp tránh những sửa đổi ngẫu nhiên đi ngược lại thiết kế ban đầu Nói cách khác, sử dụng các phương thức tĩnh và các phương thức lớp là những cách để truyền đạt ý định của nhà phát triển trong khi thực thi ý định đó đủ để tránh hầu hết các sai sót và lỗi có thể phá vỡ thiết kế Được áp dụng một cách tiết kiệm và khi nó hợp lý, việc viết một số phương thức của bạn theo cách đó có thể mang lại lợi ích về bảo trì và khiến các nhà phát triển khác ít có khả năng sử dụng lớp của bạn không đúng cách Các phương thức tĩnh cũng có lợi ích khi viết mã kiểm tra Vì phương thức 26 hoàn toàn độc lập với phần còn lại của lớp nên việc kiểm tra dễ dàng hơn nhiềuChúng ta không phải lo lắng về việc thiết lập một thể hiện lớp hoàn chỉnh trước khi có thể kiểm tra phương thức trong một bài kiểm tra đơn vị. Chúng ta có thể bắn đi giống như chúng ta sẽ thử nghiệm một chức năng thông thường. Một lần nữa, điều này làm cho việc bảo trì trong tương lai dễ dàng hơn Loại bỏ các quảng cáoChìa khóa rút ra
Đánh dấu là đã hoàn thành Xem ngay Hướng dẫn này có một khóa học video liên quan do nhóm Real Python tạo. Xem nó cùng với hướng dẫn bằng văn bản để hiểu sâu hơn. Các loại phương thức OOP trong Python. @classmethod so với @staticmethod so với Phương thức sơ thẩm 🐍 Thủ thuật Python 💌 Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python Gửi cho tôi thủ thuật Python » Giới thiệu về Dan Bader Dan Bader là chủ sở hữu và tổng biên tập của Real Python và là nhà phát triển chính của realpython. nền tảng học tập com. Dan đã viết mã hơn 20 năm và có bằng thạc sĩ về khoa học máy tính » Thông tin thêm về ĐanMỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là Aldren Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bậc thầy Kỹ năng Python trong thế giới thực Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia Nâng cao kỹ năng Python của bạn » Bạn nghĩ sao? Đánh giá bài viết này Tweet Chia sẻ Chia sẻ EmailBài học số 1 hoặc điều yêu thích mà bạn đã học được là gì? Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi Tìm kiếm một cuộc trò chuyện thời gian thực? . Python hạnh phúc tiếp tục học Danh mục hướng dẫn liên quan. trăn trung gian Khóa học video được đề xuất. Các loại phương thức OOP trong Python. @classmethod vs @staticmethod vs Phương thức sơ thẩm Phương thức bên trong lớp trong Python là gì?Phương thức là hàm “thuộc về” một đối tượng . (Trong Python, thuật ngữ phương thức không phải là duy nhất đối với các thể hiện của lớp. các loại đối tượng khác cũng có thể có các phương thức. Ví dụ: các đối tượng danh sách có các phương thức được gọi là chắp thêm, chèn, xóa, sắp xếp, v.v.
Chúng ta có thể định nghĩa phương thức trong lớp không?Phương thức của lớp được gọi là phương thức thể hiện . Nó là một phương thức không tĩnh được định nghĩa trong lớp. Trước khi gọi hoặc gọi phương thức cá thể, cần tạo một đối tượng của lớp của nó. Hãy xem một ví dụ về một instance method.
Chúng ta có thể định nghĩa một lớp bên trong một lớp trong Python không?Bạn có thể có nhiều lớp bên trong trong một lớp . Như chúng ta đã định nghĩa trước đó, thật dễ dàng để triển khai nhiều lớp bên trong. lớp ngoài. """Lớp bên ngoài""" def __init__(self). ## Khởi tạo bản thân lớp 'Bên trong'.
Tôi có thể viết một hàm bên trong một lớp bằng Python không?Nếu bạn xác định một hàm bên trong một hàm khác, thì bạn đang tạo một hàm bên trong, còn được gọi là hàm lồng nhau. Trong Python, các hàm bên trong có quyền truy cập trực tiếp vào các biến và tên mà bạn xác định trong hàm kèm theo |