Tuy nhiên, không có từ khóa nào được gọi là công khai, riêng tư và được bảo vệ trong Python. Do đó, chúng ta phải sử dụng một số quy ước nhất định để hạn chế các thành viên
Không có gì khó chịu, chúng ta hãy đi sâu vào tìm hiểu thêm về các công cụ sửa đổi
? Public Attribute In Python
- Trong Python, mọi thành viên của lớp đều được mặc định là công khai
- Các thành viên công khai trong một lớp có thể được truy cập từ bất kỳ đâu bên ngoài lớp
- Bạn có thể truy cập các thành viên chung bằng cách tạo đối tượng của lớp
ví dụ 1
class Music: # Creating a constructor def __init__[self]: self.genre = "Pop" self.singer = "Coldplay" # These are public attributes # Creating a function def foo[self]: song = 'Hymn For The Weekend' return song # Creating object of the class m = Music[] # Accessing the members inside the class print["Song: ", m.foo[]] print["Genre:", m.genre] print["Singer:", m.singer]
đầu ra
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay
?Ghi chú. Ngay cả lớp dẫn xuất cũng có thể truy cập các thành viên công khai
ví dụ 2
? Private Attributes in Python
Thật không may, Python không có cách hạn chế hiệu quả quyền truy cập vào các biến hoặc phương thức đối tượng. ?
Tuy nhiên, chúng tôi có một cách giải quyết. Để khai báo một thành viên là riêng tư trong Python, bạn phải sử dụng dấu gạch dưới kép
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay0 làm tiền tố cho các biến. Các thành viên riêng tư bị hạn chế trong cùng một lớp, tôi. e. chúng ta chỉ có thể truy cập các thành viên riêng tư trong cùng một lớp
Thí dụ
class Music: # constructor def __init__[self]: # These are private variables self.__genre = "Pop" self.__singer = "Coldplay" # private function def __func[self]: print['Music: Hym For The Weekend'] def foo[self]: # Accessing private members of the class obj.__func[] print["Genre:", obj.__genre] print["Singer:", obj.__singer] obj = Music[] # Creating an object of the Music class obj.foo[] # calling the private function
đầu ra
Music: Hym For The Weekend Genre: Pop Singer: Coldplay
Giải trình
Trong ví dụ trên, chúng tôi đã sử dụng hai dấu gạch dưới trước các mã định danh
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay1 và
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay2] để đặt các biến ở chế độ riêng tư. Tương tự, quy ước tương tự đã được sử dụng cho hàm
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay3 để đảm bảo rằng đó là một phương thức riêng tư
☠️ THẬN TRỌNG
Nếu bạn cố gắng truy cập thành viên riêng bên ngoài lớp học, bạn sẽ nhận được Lỗi thuộc tính .
Thí dụ
________số 8đầu ra
Traceback [most recent call last]: File "main.py", line 24, in obj.__func[] AttributeError: 'Music' object has no attribute '__func'
Vì vậy, điều này đưa chúng ta đến câu hỏi – Làm cách nào để truy cập các thuộc tính riêng tư từ bên ngoài lớp?
Khi bạn sử dụng dấu gạch dưới kép [e. g. ,
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay4], Python đùa giỡn với cái tên đặt cho nó các thuộc tính của một thuộc tính riêng tư. Tuy nhiên, biến vẫn có thể được truy cập từ bên ngoài lớp bằng cách sử dụng tên khó hiểu của nó. Do đó, nó không hoàn toàn riêng tư
Điều này đưa chúng ta đến một khái niệm rất quan trọng trong Python – Name Mangling. Bạn có thể truy cập các thuộc tính riêng tư bên ngoài lớp bằng cách sử dụng xáo trộn tên
✨ Xáo trộn tên bằng Python
Name Mangling là một quá trình trong Python, trong đó, nếu một phương thức, trong bất kỳ trường hợp nào, có hai dấu gạch dưới trước tên và nhiều nhất một dấu gạch dưới sau tên, thì nó sẽ được thay thế bằng
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay5 trước nó, chẳng hạn,
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay6 trở thành
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay7. Vì tên được thay đổi bên trong bởi trình thông dịch nên chúng ta không thể truy cập biến bằng cách sử dụng tên gốc của nó và đó là cách bạn có thể ẩn dữ liệu trong Python
Ghi chú. Mangling tên về cơ bản được sử dụng để tránh ghi đè các phương thức cho các lớp cha bởi các lớp kế thừa.
Hãy xem một ví dụ để hiểu cách các biến riêng tư được truy cập bên ngoài lớp với sự trợ giúp của xáo trộn tên
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay4
đầu ra
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay5
? Protected Attributes in Python
Bạn có thể truy cập các thuộc tính được bảo vệ của một lớp từ bên trong lớp và chúng cũng có thể được truy cập bởi các lớp con. Điều này tạo điều kiện thuận lợi cho việc kế thừa trong Python
Để tạo một biến được bảo vệ, bạn phải thêm một dấu gạch dưới [e. g.
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay8] làm tiền tố cho nó. Để làm cho nó thực sự được bảo vệ, bạn cũng phải sử dụng một thuộc tính trang trí
Thí dụ
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay7
đầu ra
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay8
Giải trình
- Trang trí
Song: Hymn For The Weekend Genre: Pop Singer: Coldplay
9 đảm bảo rằng phương thứcclass Music: # constructor def __init__[self]: # These are private variables self.__genre = "Pop" self.__singer = "Coldplay" # private function def __func[self]: print['Music: Hym For The Weekend'] def foo[self]: # Accessing private members of the class obj.__func[] print["Genre:", obj.__genre] print["Singer:", obj.__singer] obj = Music[] # Creating an object of the Music class obj.foo[] # calling the private function
0 là thuộc tính class Music: # constructor def __init__[self]: # These are private variables self.__genre = "Pop" self.__singer = "Coldplay" # private function def __func[self]: print['Music: Hym For The Weekend'] def foo[self]: # Accessing private members of the class obj.__func[] print["Genre:", obj.__genre] print["Singer:", obj.__singer] obj = Music[] # Creating an object of the Music class obj.foo[] # calling the private function
1 decorator cho phép chúng tôi quá tải phương thứcclass Music: # constructor def __init__[self]: # These are private variables self.__genre = "Pop" self.__singer = "Coldplay" # private function def __func[self]: print['Music: Hym For The Weekend'] def foo[self]: # Accessing private members of the class obj.__func[] print["Genre:", obj.__genre] print["Singer:", obj.__singer] obj = Music[] # Creating an object of the Music class obj.foo[] # calling the private function
0 . Bây giờ, biếnclass Music: # constructor def __init__[self]: # These are private variables self.__genre = "Pop" self.__singer = "Coldplay" # private function def __func[self]: print['Music: Hym For The Weekend'] def foo[self]: # Accessing private members of the class obj.__func[] print["Genre:", obj.__genre] print["Singer:", obj.__singer] obj = Music[] # Creating an object of the Music class obj.foo[] # calling the private function
3 được bảo vệ. Nhưng điều này
? . – Bạn vẫn có thể truy cập bài hát từ bên ngoài bằng cách sử dụng
class Music: # constructor def __init__[self]: # These are private variables self.__genre = "Pop" self.__singer = "Coldplay" # private function def __func[self]: print['Music: Hym For The Weekend'] def foo[self]: # Accessing private members of the class obj.__func[] print["Genre:", obj.__genre] print["Singer:", obj.__singer] obj = Music[] # Creating an object of the Music class obj.foo[] # calling the private function4. Vì vậy, bạn phải luôn tránh truy cập hoặc sửa đổi các biến có tiền tố là
class Music: # constructor def __init__[self]: # These are private variables self.__genre = "Pop" self.__singer = "Coldplay" # private function def __func[self]: print['Music: Hym For The Weekend'] def foo[self]: # Accessing private members of the class obj.__func[] print["Genre:", obj.__genre] print["Singer:", obj.__singer] obj = Music[] # Creating an object of the Music class obj.foo[] # calling the private function5 từ bên ngoài lớp
❖ Kết luận
Vì vậy, chúng ta đã học về một trong những khái niệm OOP quan trọng nhất trong Python trong hướng dẫn này, đó là. e. , cách bạn có thể sử dụng các thuộc tính công khai, riêng tư và được bảo vệ trong Python
Tôi hy vọng bài viết này đã giúp bạn. Hãy theo dõi và đăng ký để có nhiều cuộc thảo luận thú vị hơn trong tương lai
Tác giả .
??
?? RASHI AGARWAL
Shubham Sayon
Tôi là một người tạo nội dung và Blogger Python chuyên nghiệp. Tôi đã xuất bản nhiều bài báo và tạo các khóa học trong một khoảng thời gian. Hiện tại tôi đang làm việc với tư cách là một freelancer toàn thời gian và tôi có kinh nghiệm trong các lĩnh vực như Python, AWS, DevOps và Networking