Computer >> Máy Tính >  >> Lập trình >> Python

Biến riêng trong chương trình Python


Trong hướng dẫn này, chúng ta sẽ tìm hiểu về biến riêng trong các lớp Python .

Python không có khái niệm được gọi là biến riêng . Tuy nhiên, hầu hết các nhà phát triển Python tuân theo quy ước đặt tên để nói rằng một biến không phải là công khai và nó là riêng tư.

Chúng ta phải bắt đầu một tên biến bằng dấu gạch dưới kép để biểu diễn nó như một biến riêng (không thực sự). Ví dụ:- một, hai, v.v. ..,.

Như chúng ta đã nói, các biến có tên bắt đầu bằng dấu gạch dưới kép không phải là private, chúng ta vẫn có thể truy cập. Hãy xem cách tạo các biến kiểu riêng tư và sau đó chúng ta sẽ xem cách truy cập chúng.

# creating a class
class Sample:
   def __init__(self, nv, pv):
      # normal variable
      self.nv = nv
      # private variable(not really)
      self.__pv = pv
# creating an instance of the class Sample
sample = Sample('Normal variable', 'Private variable')

Chúng tôi đã tạo một lớp và thể hiện của nó. Chúng ta có hai biến một là bình thường và một là riêng tư bên trong phương thức __init__. Bây giờ, hãy thử truy cập các biến. Và hãy xem điều gì sẽ xảy ra.

Ví dụ

# creating a class
class Sample:
   def __init__(self, nv, pv):
      # normal variable
      self.nv = nv
      # private variable(not really)
      self.__pv = pv
# creating an instance of the class Sample
sample = Sample('Normal variable', 'Private variable')
# accessing *nv*
print(sample.nv)
# accessing *__pv**
print(sample.__pv)

Đầu ra

Nếu bạn chạy đoạn mã trên, thì bạn sẽ nhận được kết quả sau.

Normal variable
---------------------------------------------------------------------------
AttributeError                         Traceback (most recent call last)
<ipython-input-13-bc324b2d20ef> in <module>
      14
      15 # accessing *__pv**
---> 16 print(sample.__pv)
AttributeError: 'Sample' object has no attribute '__pv'

Chương trình đã hiển thị biến nv mà không có bất kỳ lỗi nào. Nhưng chúng tôi nhận được AttributeError khi chúng tôi cố gắng truy cập __ pv biến.

Tại sao chúng ta gặp lỗi này? Bởi vì không có bất kỳ thuộc tính nào có tên biến __ pv . Sau đó, những gì về bản thân .__ pv =pv câu lệnh trong phương thức init? Chúng ta sẽ thảo luận về vấn đề này một chút. Trước tiên, hãy xem cách truy cập __ pv biến.

Chúng tôi có quyền truy cập bất kỳ biến lớp nào có tên bắt đầu bằng dấu gạch dưới kép dưới dạng _className \ _variableName_ . Vì vậy, trong hoặc ví dụ, đó là _Sample \ _pv_ . Bây giờ, hãy truy cập nó bằng cách sử dụng _Sample \ _pv_ tên.

Ví dụ

# creating a class
class Sample:
   def __init__(self, nv, pv):
      # normal variable
      self.nv = nv
      # private variable(not really)
      self.__pv = pv
# creating an instance of the class Sample
sample = Sample('Normal variable', 'Private variable')
# accessing *nv*
print(sample.nv)
# accessing *__pv** using _Sample__pv name
print(sample._Sample__pv)

Đầu ra

Nếu bạn chạy đoạn mã trên, bạn sẽ nhận được kết quả sau.

Normal variable
Private variable

Tại sao lại có tên biến __ pv đã thay đổi?

Trong Python, có một khái niệm được gọi là tên mangling. Python thay đổi tên của các biến bắt đầu bằng dấu gạch dưới kép . Vì vậy, bất kỳ biến lớp nào có tên bắt đầu bằng dấu gạch dưới kép sẽ chuyển thành dạng _className \ _variableName_ .

Vì vậy, khái niệm này cũng sẽ áp dụng cho các phương thức của lớp. Bạn có thể thấy nó bằng đoạn mã sau.

Ví dụ

class Sample:
   def __init__(self, a):
      self.a = a

   # private method(not really)
   def __get_a(self):
      return self.a
# creating an instance of the class Sample
sample = Sample(5)
# invoking the method with correct name
print(sample._Sample__get_a())
# invoking the method with wrong name
print(sample.__get_a())

Đầu ra

Nếu bạn chạy đoạn mã trên, bạn sẽ nhận được kết quả sau.

5
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-19-55650c4990c8> in <module>
      14
      15 # invoking the method with wrong name
---> 16 print(sample.__get_a())
AttributeError: 'Sample' object has no attribute '__get_a'

Kết luận

Mục đích của việc sử dụng dấu gạch dưới kép không hạn chế truy cập biến hoặc phương thức. Nó có nghĩa là biến hoặc phương thức cụ thể chỉ được ràng buộc bên trong lớp. Nếu bạn có bất kỳ câu hỏi nào trong hướng dẫn, hãy đề cập đến chúng trong phần bình luận.