Các ví dụ trên là các lớp và đối tượng ở dạng đơn giản nhất và không thực sự hữu ích trong các ứng dụng thực tế
Để hiểu ý nghĩa của các lớp, chúng ta phải hiểu hàm __init__[] tích hợp sẵn
Tất cả các lớp đều có một hàm gọi là __init__[], hàm này luôn được thực thi khi lớp bắt đầu
Sử dụng hàm __init__[] để gán giá trị cho thuộc tính đối tượng hoặc các thao tác khác cần thực hiện khi đối tượng được tạo
Thí dụ
Tạo một lớp tên là Person, sử dụng hàm __init__[] để gán giá trị cho tên và tuổi
lớp Người.
def __init__[bản thân, tên, tuổi].
bản thân. tên = tên
bản thân. tuổi = tuổi
p1 = Người["John", 36]
in[p1. tên]
in[p1. tuổi]
Ghi chú. Hàm
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown5 được gọi tự động mỗi khi lớp được sử dụng để tạo một đối tượng mới
Khi đọc mã Python của người khác, nhiều người mới bắt đầu cảm thấy bối rối với phương pháp
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown6. Mục đích của nó là gì?
__init__ trong Python là gì?
Xem video này trên YouTube
Mục đích của
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown6 trong Python là gì?
Phương thức Python dành riêng
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown5 được gọi là hàm tạo của một lớp. Bạn có thể gọi phương thức khởi tạo để tạo một đối tượng [= thể hiện] từ một lớp và khởi tạo các thuộc tính của nó
Mặc dù điều này trả lời câu hỏi, nhưng nếu bạn có bất kỳ tham vọng nào trong việc trở thành một lập trình viên Python chuyên nghiệp, thì việc biết rằng phương thức
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 là hàm tạo của một lớp là chưa đủ. Bạn cũng cần biết cách sử dụng hàm tạo trong các dự án của riêng mình—và cách tùy chỉnh các đối số của nó. Sự hiểu biết thấu đáo về hàm tạo đóng vai trò là nền tảng vững chắc cho các khái niệm nâng cao hơn trong lập trình Python hướng đối tượng. Đọc tiếp để tìm hiểu nửa còn lại của phương trình
Ví dụ tương tác. Trước khi tôi giải thích cho bạn, hãy mở lỗ hổng kiến thức của bạn. Xem xét ví dụ sau
Tập thể dục. Thêm một màu đối số vào phương thức
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 và làm cho mã chạy không có lỗi
Hãy đi sâu vào ví dụ đơn giản này một cách chi tiết
Làm thế nào để sử dụng phương pháp __init__ trong thực tế?
Chúng tôi sẽ sử dụng một số thuật ngữ lập trình hướng đối tượng trong Python để giải thích ví dụ của chúng tôi. Đảm bảo nghiên cứu bảng cheat sau [bạn cũng có thể tải xuống bản PDF tại đây]. Nhấp vào hình ảnh để lấy bảng gian lận [mở trong tab mới]. Nếu bạn đã quen thuộc với các thuật ngữ hướng đối tượng cơ bản như lớp và thể hiện, chỉ cần đọc tiếp
Bạn đã biết rằng phương thức
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 là phương thức khởi tạo của một lớp. Bạn gọi phương thức khởi tạo để tạo các thể hiện [hoặc đối tượng] mới. Nhưng chính xác thì điều này diễn ra như thế nào trong thực tế?
Tự luận
Hàm tạo
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 yêu cầu ít nhất một đối số. Theo tiêu chuẩn PEP8, nên biểu thị đối số này là
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown3. Trong mọi trường hợp, đối số
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown3 trỏ đến chính phiên bản mới được tạo và nó cho phép bạn thao tác các thuộc tính phiên bản của phiên bản mới. Trong ví dụ về con chó, bạn sẽ sử dụng
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown5 để đặt thuộc tính
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown6 của con chó mới tạo thành chuỗi
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown7
Hãy xem ví dụ mã cơ bản sau đây
class Dog: def __init__[self]: self.color = "blue" bello = Dog[] print[bello.color] # blue
- Chúng ta tạo một lớp mới Dog với hàm tạo
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown
6 - Chúng tôi tạo một thể hiện mới của lớp
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown
9 có tên làclass Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown
0. Có hai quan sát thú vị. Đầu tiên, chúng ta sử dụng tên lớp thay vì tên hàm tạo để tạo thể hiện mới. Python gọi nội bộ phương thức __init__ cho chúng tôi. Thứ hai, chúng tôi không vượt qua bất kỳ đối số nào khi gọiclass Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown
1. Một lần nữa, Python hoàn toàn chuyển một tham chiếu đến thể hiện mới được tạo [class Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown
0] cho hàm tạoclass Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown
9 - Chúng tôi in thuộc tính màu của phiên bản
class Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown
0 mới được tạo. Kết quả là giá trị chuỗiclass Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown
7 như được định nghĩa trong hàm tạo
Tuy nhiên, ví dụ tối thiểu này là không thực tế. Một số con chó có màu nâu, những con khác có màu đen và chỉ một số có màu xanh lam
Nhiều đối số hàm tạo
Vậy làm thế nào chúng ta có thể tạo ra những con chó khác nhau với màu sắc khác nhau? . Đây là một ví dụ khác khi chúng tôi tạo hai chú chó có màu sắc khác nhau. Bạn có thể nhận ra màu sắc của chúng?
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown
Ngược lại với ví dụ đầu tiên, bây giờ chúng ta xác định hàm tạo
class Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown8 với hai đối số thay vì một
Đầu tiên là đối số
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown3 như trước. Đối số thứ hai là đối số tùy chỉnh
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown6 được thông qua bởi người gọi hàm tạo. Trong trường hợp của chúng tôi, chúng tôi tạo hai phiên bản Dog,
class Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown0 và
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown82, bằng cách chỉ định đối số
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown6 cho cả hai
Lưu ý rằng đối số
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown3 được xử lý hoàn toàn bởi môi trường lập trình Python. Python chỉ cần chuyển một tham chiếu đến thể hiện
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 tương ứng tới hàm tạo
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9
Sự khác biệt giữa Trình xây dựng và Trình khởi tạo là gì?
Chà, tôi đã không sử dụng một thuật ngữ rất chính xác trong các đoạn trước. Tôi đã sử dụng thuật ngữ “hàm tạo” cho cả lệnh gọi
class Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown1 và lệnh gọi
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown5. Nhưng chỉ cuộc gọi cũ mới có thể được biểu thị là phương thức khởi tạo vì chỉ cuộc gọi này mới thực sự tạo ra một thể hiện mới. Vào thời điểm đó, chúng tôi gọi phương thức
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9, thể hiện đã được tạo [Python chuyển nó cho chúng tôi thông qua đối số
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown3]. Đó là lý do tại sao một thuật ngữ chính xác hơn cho phương thức
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 là phương thức khởi tạo. Đó là cách tôi sẽ biểu thị nó ở phần sau để bù đắp cho nó. 😉
Ý nghĩa của dấu gạch dưới trong tên phương thức __init__ là gì?
Tôi đã viết cả một bài về ý nghĩa của dấu gạch dưới trong Python. Hãy xem nếu chủ đề này khiến bạn quan tâm hơn nữa. Tuy nhiên, điểm mấu chốt là như sau
Dấu gạch dưới kép “__” [được gọi là “dunder“] được sử dụng để tạo thuộc tính cá thể hoặc phương thức riêng tư [không thể truy cập từ bên ngoài lớp] — khi được sử dụng làm dấu gạch dưới hàng đầu. Khi được sử dụng như bao vây dunder [e. g. “__init__”] nó chỉ ra rằng đó là một phương thức đặc biệt trong Python [được gọi là “phương thức ma thuật”]
Làm cách nào để sử dụng __init__ trong Lớp kế thừa?
Lớp kế thừa là lớp kế thừa tất cả các thuộc tính và phương thức từ lớp cha. Đây là một ví dụ
class Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown
Tính kế thừa rất quan trọng trong Python. Trong ví dụ, lớp cha là lớp Dog mà bạn đã biết ở trên. Phương thức khởi tạo __init__ xác định màu của con chó này
Bây giờ, chúng ta cũng tạo một lớp mới
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown52 kế thừa tất cả các thuộc tính từ lớp cha
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9. Bạn có thể định nghĩa tính kế thừa bằng cách chỉ định tên của lớp cha trong dấu ngoặc sau lớp con.
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown54
Điều thú vị là phương thức __init__ của lớp con CuteDog gọi phương thức __init__ của lớp cha. Điều này có ý nghĩa vì lớp con có các thuộc tính giống như lớp cha—và chúng cũng cần được khởi tạo
Tuy nhiên, cách Pythonic hơn là sử dụng hàm
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown55 giúp bạn truy cập lớp cha dễ dàng hơn
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown8
Với sự trợ giúp của hàm
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown55, bạn có thể dễ dàng sử dụng lại phương thức khởi tạo của lớp cha
Hãy xem xét một vài câu hỏi liên quan
__ init __ có cần thiết trong Python không?
Không. Bạn chỉ cần bỏ qua phương thức khởi tạo. Do đó, lớp của bạn sẽ không có bất kỳ thuộc tính thể hiện nào ngay sau khi tạo. Tuy nhiên, bạn có thể tự động thêm các thuộc tính phiên bản vào bất kỳ thời điểm nào trong tương lai. Đây là một ví dụ
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown5
đẹp làm sao. Bạn thậm chí có thể tạo các lớp trống và “điền vào” các phương thức và thuộc tính sau này trong Python
__ init __ Trả về là gì?
Bản thân phương thức
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 không trả về gì cả. Về mặt kỹ thuật, Python đầu tiên sử dụng phương thức khởi tạo
class Dog: def __init__[self, color]: self.color = color class CuteDog[Dog]: def __init__[self, color]: Dog.__init__[self, color] self.hairs = True bello = CuteDog['brown'] print[bello.hairs] # True print[bello.color] # brown1 trước khi sử dụng
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 để khởi tạo tất cả các thuộc tính. Do đó, chỉ hàm tạo mới trả về thể hiện mới được tạo
__init__ có thể trả về giá trị không?
Không. Giá trị trả về duy nhất không gây ra lỗi thời gian chạy là
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown30. Tất cả các giá trị trả về khác đều gây ra lỗi. Xem ví dụ mã sau
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown3
Vì vậy, đừng bao giờ sử dụng bất kỳ giá trị trả về nào trong phương thức __init__ và bạn đã sẵn sàng
Đi đâu từ đây?
Cảm ơn đã đọc hết bài viết. Bạn đã biết rằng tên
class Dog: def __init__[self, color]: self.color = color bello = Dog["blue"] print[bello.color] # blue alice = Dog["brown"] print[alice.color] # brown9 được dành riêng cho phương thức khởi tạo Python được gọi trong hàm tạo
Bài viết yêu cầu nắm vững kiến thức cơ bản về Python. Đầu tư thời gian để tìm hiểu và nghiên cứu những điều đó là rất quan trọng để bạn thành công với tư cách là một lập trình viên chuyên nghiệp
Để giúp mọi người phát triển kỹ năng của họ theo cách tự động, được cá nhân hóa, tôi đã tạo một khóa học Python qua email miễn phí “Coffee Break Python” giúp nâng cao trình độ kỹ năng của bạn một cách dường như vô tận. Ngày này qua ngày khác…
Tham gia cùng hàng chục nghìn lập trình viên Python [miễn phí 100%]
Chris
Trong khi làm việc với tư cách là một nhà nghiên cứu trong các hệ thống phân tán, Dr. Christian Mayer tìm thấy tình yêu của mình với việc dạy sinh viên khoa học máy tính
Để giúp sinh viên đạt được mức độ thành công Python cao hơn, anh ấy đã thành lập trang web giáo dục lập trình Finxter. com. Ông là tác giả của cuốn sách lập trình nổi tiếng Python One-Liners [NoStarch 2020], đồng tác giả của loạt sách tự xuất bản Coffee Break Python, người đam mê khoa học máy tính, cộng tác viên tự do và chủ sở hữu của một trong 10 blog Python lớn nhất thế giới
Niềm đam mê của anh ấy là viết, đọc và mã hóa. Nhưng niềm đam mê lớn nhất của anh ấy là phục vụ các lập trình viên đầy tham vọng thông qua Finxter và giúp họ nâng cao kỹ năng của mình. Bạn có thể tham gia học viện email miễn phí của anh ấy tại đây