Lớp riêng Python

Trong ngữ cảnh của lớp, riêng tư có nghĩa là các thuộc tính chỉ khả dụng cho các thành viên của lớp không dành cho bên ngoài lớp

Giả sử chúng ta có lớp sau có thuộc tính riêng [__alias]

# p.py
class P:
   def __init__[self, name, alias]:
      self.name = name       # public
      self.__alias = alias   # private

   def who[self]:
      print['name  : ', self.name]
      print['alias : ', self.__alias]

Chúng tôi tạo một thể hiện của lớp P, sau đó cố gắng truy cập các thuộc tính của nó cho dù đó là công khai hay riêng tư

>>> from p import P
>>> x = P[name='Alex', alias='amen']
>>> x.name
'Alex'
>>> x.alias
Traceback [most recent call last]:
  File "", line 1, in 
AttributeError: P instance has no attribute 'alias'

Đối với tên thuộc tính công khai, chúng ta có thể truy cập thông qua một biến thể hiện, nhưng đối với bí danh thuộc tính riêng tư thì không. Thậm chí chúng tôi thử điều này

>>> x.__alias
Traceback [most recent call last]:
  File "", line 1, in 
AttributeError: P instance has no attribute '__alias'

chúng tôi vẫn không được phép truy cập nó

Nhưng đây là một mong muốn kỳ diệu. Một dấu gạch dưới['_'] với tên lớp sẽ làm nên điều kỳ diệu

>>> x._P__alias
'amen'

Cuộc gọi sau cũng hoạt động như mong đợi

>>> x.who[]
['name  : ', 'Alex']
['alias : ', 'amen']

Chúng tôi sẽ sử dụng mã giống như trong phần trước nhưng chúng tôi sẽ thêm hai phương thức. phương thức foo[] và __foo[]

Về cốt lõi, Python là ngôn ngữ lập trình hướng đối tượng [OOP], ngôn ngữ này xây dựng các tính năng của nó xung quanh các đối tượng. Một chuỗi là một đối tượng, một thể hiện của một lớp tùy chỉnh là một đối tượng và một lớp, mô-đun và thậm chí cả gói cũng vậy. Một nguyên tắc dài hạn trong viết mã OOP là đóng gói — mẫu thiết kế trong đó bạn hiển thị các chức năng mà người dùng cần trong khi ẩn các chi tiết triển khai và những chức năng mà người dùng không cần có quyền truy cập

Đối với bất kỳ dự án nào, chúng tôi xác định một loạt các lớp tùy chỉnh làm cơ sở để lập mô hình các loại dữ liệu khác nhau. Do đó, một dự án tốt có nghĩa là bạn xác định các lớp tùy chỉnh có cấu trúc tốt. Khi làm việc với các lớp này, chúng ta nên áp dụng kỹ thuật đóng gói. Mặc dù tôi không nghĩ rằng chúng ta nên coi việc đóng gói là giáo điều, nhưng bạn có thể xem xét hai tính năng đóng gói cụ thể để tăng khả năng bảo trì dự án của bạn - các phương thức được bảo vệ và riêng tư, được sử dụng nội bộ. Bài viết này là về việc chỉ cho bạn cách làm như vậy

Giới thiệu

Như một số bạn có thể biết, trong một số ngôn ngữ OOP, chúng tôi dành riêng các từ khóa để đóng gói, chẳng hạn như được bảo vệ, riêng tư và công khai, xác định cách các thuộc tính [hoặc phương thức] có thể truy cập được bên ngoài lớp. Tuy nhiên, Python không có những từ khóa này, bởi vì nói đúng ra, mọi thứ được định nghĩa trong một lớp Python đều công khai. Nghĩa là, bạn có thể truy cập bất cứ thứ gì bên trong một lớp nếu bạn thích

Tuy nhiên, vẫn có một số quy ước trong Python về đóng gói. Để tạo điều kiện thảo luận, chúng tôi sẽ sử dụng các thuật ngữ trong thế giới OOP chung. Về mặt kiểm soát mức truy cập, không có sự khác biệt giữa các thuộc tính và phương thức. Vì vậy, chúng tôi sẽ chỉ sử dụng các phương pháp để chứng minh các kỹ thuật liên quan

Xác định các phương thức được bảo vệ

Chúng ta có thể định nghĩa các thuộc tính được bảo vệ trong Python. Quy ước là sử dụng dấu gạch dưới trước tên của phương thức. Hãy xem xét ví dụ sau

class User:
def __init__[self,username] -> None:
self.username = username
def login[self]:
print[f"{self.username} just logged in."]
def signup[self]:
self._check_account_existence[]
print[f"{self.username} just signed up an account."]
def _check_account_existence[self]:
print[f"Checking if {self.username} has signed up already."]

Trong lớp User này, phương thức signup là công khai, trong khi phương thức _check_account_existence được bảo vệ. Vì phương thức này không công khai nên nó không được bao gồm trong các gợi ý tự động hoàn thành khi chúng ta làm việc với một thể hiện của lớp User

Gợi ý tự động hoàn thành Không bao gồm các phương thức được bảo vệ [Ảnh chụp màn hình của tác giả]

Như bạn có thể thấy, danh sách chỉ bao gồm phương pháp signup, nhưng không bao gồm phương pháp _check_account_existence. Đáng chú ý, nếu bạn gọi phương thức được bảo vệ này, bạn vẫn có thể làm điều đó

>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.

Lý do là như tôi đã nói trước đó, Python không có quyền kiểm soát truy cập nghiêm ngặt đối với các phương thức của một lớp và nó chỉ là một quy ước để thêm tiền tố vào tên phương thức để chỉ ra [không thực thi] rằng đó là một phương thức được bảo vệ

Xác định các phương thức riêng tư

Một kỹ thuật đóng gói khác là xác định các phương thức riêng tư. Thay vì sử dụng một dấu gạch dưới, bạn có thể sử dụng hai dấu gạch dưới làm tiền tố cho tên phương thức để chỉ ra rằng đó là một phương thức riêng tư. Quan sát một ví dụ dưới đây

class User:
def __init__[self,username] -> None:
self.username = username

def signup[self]:
self._check_account_existence[]
print[f"{self.username} just signed up an account."]

def _check_account_existence[self]:
print[f"Checking if {self.username} has signed up already."]

def login[self]:
print[f"{self.username} just logged in."]
self.__pull_data_after_login[]

def __pull_data_after_login[self]:
print[f"Pull additional data for the user: {self.username}"]

Trong lớp User,

>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
3 là một phương thức riêng tư. Theo cách tương tự, phương pháp riêng tư này không đi đến danh sách gợi ý tự động hoàn thành

Gợi ý tự động hoàn thành Không bao gồm các phương thức riêng tư [Ảnh chụp màn hình của tác giả]

Trước đây tôi đã đề cập rằng chúng ta có thể truy cập các phương thức không công khai bên ngoài lớp nếu chúng ta thích và chúng ta thấy rằng chúng ta có thể sử dụng các phương thức được bảo vệ. Nó cũng áp dụng cho các phương pháp riêng tư?

>>> user = User["cowboy"]
>>> user.__pull_data_after_login[]
# AttributeError: 'User' object has no attribute '__pull_data_after_login'

Lỗi có nghĩa là chúng ta không thể truy cập các phương thức riêng bên ngoài lớp không? . Truy cập các phương thức riêng tư bên ngoài lớp yêu cầu biết khái niệm xáo trộn tên, trong đó phương thức riêng tư có tên xáo trộn nếu nó được truy cập từ bên ngoài. Cụ thể là nó có quy định này.

>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
4 ->
>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
5. Vì vậy, chúng ta có thể truy cập vào
>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
3 như vậy

>>> user = User["cowboy"]
>>> user._User__pull_data_after_login[]
Pull additional data for the user: cowboy

Lợi ích của việc sử dụng các phương pháp không công khai

Từ các ảnh chụp màn hình này, bạn có thể thấy rằng bằng cách ẩn các phương thức không công khai [được bảo vệ và riêng tư], bạn đang giúp người dùng mã của bạn cải thiện hiệu quả viết mã, bởi vì họ không cần phải lo lắng về việc chọn một phương thức không công khai mà họ không biết.

Đáng chú ý, các phương pháp này vẫn có sẵn bên trong lớp. Hình dưới đây cho bạn thấy rằng các gợi ý tự động hoàn thành hiểu khả năng truy cập của các phương thức không công khai này

Quyền truy cập nội bộ vào các phương thức không công khai [Ảnh chụp màn hình của tác giả]

Việc đóng gói chỉ áp dụng cho mã bên ngoài lớp. Khi bạn làm việc bên trong lớp, như thể hiện trong hình trên, chúng ta vẫn có thể chọn các phương thức không công khai từ danh sách gợi ý tự động điền

Sự khác biệt bổ sung giữa các phương thức được bảo vệ và riêng tư

Khi chúng tôi giới thiệu các phương thức được bảo vệ và riêng tư trong các phần tương ứng của chúng, chúng tôi đã ngầm chứng minh hai điểm khác biệt giữa các phương thức được bảo vệ và riêng tư

  • Các phương thức được bảo vệ sử dụng một dấu gạch dưới làm tiền tố của chúng, trong khi các phương thức riêng tư sử dụng hai dấu gạch dưới làm tiền tố của chúng
  • Chúng ta có thể gọi trực tiếp các phương thức được bảo vệ bên ngoài lớp bằng cách sử dụng tên phương thức của chúng. Tuy nhiên, việc gọi các phương thức riêng tư yêu cầu xáo trộn tên

Bên cạnh hai sự khác biệt rõ ràng giữa các phương thức được bảo vệ và riêng tư, sự khác biệt chính giữa hai loại phương thức này liên quan đến khả năng truy cập của chúng trong các lớp con của chúng. Nghĩa là, các phương thức được bảo vệ có thể truy cập được trong các lớp con, trong khi các phương thức riêng tư không thể truy cập được trong các lớp con [mặc dù lý do cũng là do xáo trộn tên]. Xem xét ví dụ sau

class Administrator[User]:
def admin_signup[self]:
super[]._check_account_existence[]

def admin_login[self]:
super[].__pull_data_after_login[]
>>> admin = Administrator["rodeo"]>>> admin.admin_signup[]
Checking if rodeo has signed up already.
>>> admin.admin_login[]
# AttributeError: 'super' object has no attribute '_Administrator__pull_data_after_login'

Như đã trình bày ở trên, trong lớp

>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
7, chúng ta sử dụng các phương thức private và protected của lớp cha trong việc định nghĩa
>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
8 và
>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
9. Khi chúng tôi sử dụng hai phương pháp này, chỉ có
>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
8 hoạt động, còn
>>> user = User["cowboy"]
>>> user._check_account_existence[]
Checking if cowboy has signed up already.
9 thì không. Lý do là phương thức riêng tự động kích hoạt xáo trộn tên bằng cách sử dụng tên của lớp hiện tại. Mặc dù ý định của chúng ta là sử dụng các phương thức riêng tư của lớp cha, nhưng đơn giản là chúng không có sẵn trong lớp con

Do đó, nếu bạn muốn định nghĩa các phương thức không công khai mà không muốn chúng có thể truy cập được trong các lớp con, bạn nên sử dụng các phương thức riêng tư. Mặt khác, bạn nên sử dụng các phương thức được bảo vệ, làm cho chúng có thể truy cập được trong các lớp con

kết luận

Trong bài viết này, chúng tôi đã xem xét các kỹ thuật để xác định các phương thức được bảo vệ và riêng tư trong một lớp Python. Những kỹ thuật này liên quan đến một khái niệm OOP quan trọng - đóng gói. Mặc dù Python không sử dụng từ khóa protected hoặc private, nhưng bạn nên tôn trọng quy ước rằng chúng tôi sử dụng dấu gạch dưới làm tiền tố của các phương thức không công khai này

Nếu bạn muốn tìm hiểu thêm về Python, hãy cân nhắc đăng ký email bản tin của tôi. Nếu bạn muốn nâng cao kỹ năng Python của mình một cách có hệ thống, vui lòng xem cuốn sách mới của tôi Python How-To by Manning

Lớp riêng trong Python là gì?

Các phương thức riêng tư là những phương thức không được truy cập bên ngoài lớp cũng như bởi bất kỳ lớp cơ sở nào . Trong Python, không tồn tại các phương thức Riêng tư không thể truy cập ngoại trừ bên trong một lớp. Tuy nhiên, để xác định một phương thức riêng, tiền tố tên thành viên có dấu gạch dưới kép “__”.

Một lớp có thể ở chế độ riêng tư trong Python không?

Không có lớp/phương thức/hàm riêng trong Python . Ít nhất, không nghiêm ngặt về quyền riêng tư như trong các ngôn ngữ khác, chẳng hạn như Java. Bạn chỉ có thể chỉ ra/đề xuất quyền riêng tư.

__ init __ có riêng tư trong Python không?

Phương thức private cơ bản trong Python là phương thức __init__[] được sử dụng làm phương thức khởi tạo của lớp . Phương thức này được gọi khi bạn khởi tạo đối tượng lớp tùy thuộc vào đối số của phương thức.

Lớp học riêng là gì?

Nói chung, công khai có nghĩa là mọi người đều được phép truy cập, riêng tư có nghĩa là chỉ các thành viên của cùng một lớp mới được phép truy cập và được bảo vệ .

Chủ Đề