Dấu gạch dưới đơn ở đầu:
Python không có phương thức riêng tư thực sự. Thay vào đó, một dấu gạch dưới khi bắt đầu một phương thức hoặc tên thuộc tính có nghĩa là bạn không nên truy cập phương thức này, vì đó không phải là một phần của API.
class BaseForm(StrAndUnicode):
def _get_errors(self):
"Returns an ErrorDict for the data provided for the form"
if self._errors is None:
self.full_clean()
return self._errors
errors = property(_get_errors)
(Đoạn mã này được lấy từ mã nguồn django: django / Forms / Forms.py). Trong mã này, errors
là một thuộc tính công cộng, nhưng phương thức mà thuộc tính này gọi là _get_errors là "riêng tư", vì vậy bạn không nên truy cập nó.
Hai dấu gạch dưới ở đầu:
Điều này gây ra nhiều nhầm lẫn. Nó không nên được sử dụng để tạo ra một phương thức riêng tư. Nó nên được sử dụng để tránh phương thức của bạn bị ghi đè bởi một lớp con hoặc vô tình truy cập. Hãy xem một ví dụ:
class A(object):
def __test(self):
print "I'm a test method in class A"
def test(self):
self.__test()
a = A()
a.test()
# a.__test() # This fails with an AttributeError
a._A__test() # Works! We can access the mangled name directly!
Đầu ra:
$ python test.py
I'm test method in class A
I'm test method in class A
Bây giờ hãy tạo một lớp con B và thực hiện tùy chỉnh cho phương thức __test
class B(A):
def __test(self):
print "I'm test method in class B"
b = B()
b.test()
Đầu ra sẽ là ....
$ python test.py
I'm test method in class A
Như chúng ta đã thấy, A.test () đã không gọi các phương thức B .__ test () như chúng ta mong đợi. Nhưng trên thực tế, đây là hành vi đúng cho __. Hai phương thức được gọi là __test () được tự động đổi tên (xáo trộn) thành _A__test () và _B__test (), vì vậy chúng không vô tình ghi đè. Khi bạn tạo một phương thức bắt đầu bằng __, điều đó có nghĩa là bạn không muốn bất kỳ ai có thể ghi đè lên nó và bạn chỉ có ý định truy cập nó từ bên trong lớp của chính nó.
Hai dấu gạch dưới ở đầu và cuối:
Khi chúng ta thấy một phương thức như thế __this__
, đừng gọi nó. Đây là một phương thức mà python có nghĩa là để gọi, không phải bạn. Hãy xem:
>>> name = "test string"
>>> name.__len__()
11
>>> len(name)
11
>>> number = 10
>>> number.__add__(40)
50
>>> number + 50
60
Luôn có một toán tử hoặc hàm riêng gọi các phương thức ma thuật này. Đôi khi nó chỉ là một cuộc gọi trăn trong các tình huống cụ thể. Ví dụ __init__()
được gọi khi đối tượng được tạo sau __new__()
được gọi để xây dựng thể hiện ...
Hãy lấy một ví dụ ...
class FalseCalculator(object):
def __init__(self, number):
self.number = number
def __add__(self, number):
return self.number - number
def __sub__(self, number):
return self.number + number
number = FalseCalculator(20)
print number + 10 # 10
print number - 20 # 40
Để biết thêm chi tiết, xem hướng dẫn PEP-8 . Để biết thêm các phương pháp kỳ diệu, xem bản PDF này .