Phương pháp riêng python

Trong Python, không tồn tại các biến instance Private không thể truy cập được ngoại trừ khi ta truy cập từ bên trong một đối tượng. Tuy nhiên, một quy ước đang được giám sát bởi hầu hết các mã và bộ mã hóa trong Python, đó là một tên được thêm tiền tố gạch dưới, ví dụ _geek sẽ được coi là một phần không công khai của API hoặc bất chấp . Trong khi thực hiện điều này, chúng ta cũng sẽ cố gắng tìm hiểu thêm khái niệm về các dạng dấu gạch dưới khác nhau, ví dụ như _ trong phạm vi (10), __init __ (tự)

Nội dung chính

  • 1. Mangling và cách thức hoạt động
  • 2. _lined gạch dưới menu hàng đầu
  • 3. __dấu gạch dưới kép hàng đầu
  • 4. __dấu gạch dưới hàng đầu và gạch dưới hàng cuối__

1. Mangling và cách thức hoạt động

Trong Python, có một thứ được gọi là xáo trộn tên, có nghĩa là có một chế độ hỗ trợ cho trường hợp sử dụng hợp lệ cho các thành viên lớp riêng về cơ bản để tránh xung đột tên của các tên với tên đã được định nghĩa . Bất kỳ danh sách nào của mẫu __geek (ít nhất hai gạch dưới hàng đầu hoặc nhiều nhất một gạch dưới hàng sau) được thay thế bằng _ classname__geek, trong đó tên lớp là tên của lớp hiện tại có gạch dưới hàng đầu. Miễn phí xảy ra trong định nghĩa của lớp, việc đọc sai này sẽ được thực hiện. Điều này rất hữu ích để cho phép các lớp con ghi đè các phương thức mà không kết thúc cuộc gọi phương thức nội bộ

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: [email protected]
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------


# Python code to illustrate how mangling works 
class Map: 
    def __init__(self, iterate): 
        self.list = [] 
        self.__cafedev(iterate) 
    def cafedev(self, iterate): 
        for item in iterate: 
            self.list.append(item) 
  
    # private copy of original cafedev() method 
    __cafedev = cafedev    
  
class MapSubclass(Map): 
      
    # provides new signature for cafedev() but 
    # does not break __init__() 
    def cafedev(self, key, value):         
        for i in zip(keys, values): 
            self.list.append(i) 

Quy tắc xáo trộn được thiết kế chủ yếu để tránh tai nạn nhưng vẫn có thể truy cập hoặc sửa đổi một biến riêng tư. Điều này có thể hữu ích trong các trường hợp đặc biệt, chẳng hạn như trong quá trình giải quyết lỗi

2. _lined gạch dưới menu hàng đầu

Về cơ bản, một gạch chân trong phần đầu của một phương thức, hàm hoặc thành viên dữ liệu có nghĩa là bạn không nên truy cập vào phương thức này vì nó không phải là một phần của API. Vui lòng xem đoạn mã này

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: [email protected]
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------


# Python code to illustrate  
# how single underscore works 
def _get_errors(self): 
    if self._errors is None: 
        self.full_clean() 
    return self._errors 
  
errors = property(_get_errors) 

Đoạn mã được lấy từ mã nguồn Django (django / Forms / Forms. py). Điều này cho thấy rằng lỗi là một thuộc tính và nó cũng là một phần của API, nhưng phương thức_get_errors là riêng tư, vì vậy người ta không nên truy cập nó

3. __dấu gạch dưới kép hàng đầu

Hai gạch chân ở đầu có thể gây ra nhiều nhầm lẫn. Đây là vấn đề về cú pháp chứ không phải là một quy ước. Dấu gạch dưới sẽ làm xáo trộn tên thuộc tính của một lớp để tránh xung đột tên thuộc tính giữa các lớp. Lấy ví dụ

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: [email protected]
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------


# Python code to illustrate how double  
# underscore at the beginning works 
class Cafedev: 
    def _single_method(self): 
        pass
    def __double_method(self): # for mangling 
        pass
class Pyth(Cafedev): 
    def __double_method(self): # for mangling 
        pass

4. __dấu gạch dưới hàng đầu và gạch dưới hàng cuối__

Có một trường hợp khác về gạch dưới hàng kép đầu và hàng cuối. Chúng ta tuân theo điều này khi sử dụng các biến hoặc phương thức đặc biệt (được gọi là ma thuật phương thức), chẳng hạn như __len__, __init__. Các phương thức này cung cấp các tính năng cú pháp đặc biệt cho các tên. Ví dụ. __file__ only ra vị trí của tệp Python, __eq__ được thực thi khi biểu thức a == b được thực thi.
Lấy ví dụ.


# Python code to illustrate double leading and  
# double trailing underscore works 
class Cafedev: 
  
    # '__init__' for initializing, this is a 
    # special method   
    def __init__(self, ab):  
        self.ab = ab 
  
    # custom special method. try not to use it 
    def __custom__(self):  
        pass

Nguồn và Tài liệu tiếng anh tham khảo

  • w3school
  • con trăn. tổ chức
  • chuyên viên máy tính

Tài liệu từ cafedev

  • Trọn bộ tự học Python từ cơ bản tăng cao tại đây nha
  • Ebook về python tại đây
  • Các chuỗi tự học lập trình khác nhau

Nếu thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa