__ __ Python nghĩa là gì?

Rất có thể bạn đã thấy biến __name__ khi bạn xem qua mã Python. Dưới đây bạn thấy một đoạn mã ví dụ về giao diện của nó

if __name__ == '__main__':    main()

Trong bài viết này, tôi muốn chỉ cho bạn cách bạn có thể sử dụng biến này để tạo các mô-đun trong Python

Tại sao biến _ _name_ _ được sử dụng?

Biến __name__ (hai dấu gạch dưới trước và sau) là một biến Python đặc biệt. Nó nhận được giá trị của nó tùy thuộc vào cách chúng tôi thực thi tập lệnh chứa

Đôi khi bạn viết một tập lệnh với các chức năng cũng có thể hữu ích trong các tập lệnh khác. Trong Python, bạn có thể nhập tập lệnh đó dưới dạng mô-đun trong tập lệnh khác

Nhờ biến đặc biệt này, bạn có thể quyết định xem mình có muốn chạy tập lệnh hay không. Hoặc bạn muốn nhập các chức năng được xác định trong tập lệnh

Biến __name__ có thể chứa những giá trị nào?

Khi bạn chạy tập lệnh của mình, biến __name__ bằng __main__. Khi bạn nhập tập lệnh chứa, nó sẽ chứa tên của tập lệnh

Chúng ta hãy xem xét hai trường hợp sử dụng này và mô tả quy trình bằng hai hình minh họa

Tình huống 1 - Chạy tập lệnh

Giả sử chúng tôi đã viết kịch bản

def myFunction():    print 'The value of __name__ is ' + __name__
0 như sau

def myFunction():    print 'The value of __name__ is ' + __name__
def main():    myFunction()
if __name__ == '__main__':    main()

Nếu bạn chạy nameScript. py, quá trình dưới đây được thực hiện

Trước khi tất cả các mã khác được chạy, biến __name__ được đặt thành __main__. Sau đó, các câu lệnh def

def myFunction():    print 'The value of __name__ is ' + __name__
2 và
def myFunction():    print 'The value of __name__ is ' + __name__
3 được chạy. Bởi vì điều kiện đánh giá là đúng, chức năng chính được gọi. Đến lượt mình, điều này gọi myFunction. Điều này in ra giá trị của __main__

Tình huống 2 - Nhập tập lệnh vào một tập lệnh khác

Nếu chúng tôi muốn sử dụng lại myFunction trong một tập lệnh khác, ví dụ như

def myFunction():    print 'The value of __name__ is ' + __name__
5, chúng tôi có thể nhập
def myFunction():    print 'The value of __name__ is ' + __name__
0 làm mô-đun

Mã trong

def myFunction():    print 'The value of __name__ is ' + __name__
5 có thể như sau

import nameScript as ns
ns.myFunction()

Sau đó chúng tôi có hai phạm vi. một trong số

def myFunction():    print 'The value of __name__ is ' + __name__
8 và phạm vi thứ hai của
def myFunction():    print 'The value of __name__ is ' + __name__
9. Trong hình minh họa, bạn sẽ thấy nó khác với trường hợp sử dụng đầu tiên như thế nào

Trong importScript. py biến __name__ được đặt thành __main__. Bằng cách nhập nameScript, Python bắt đầu tìm kiếm tệp bằng cách thêm

def main():    myFunction()
1 vào tên mô-đun. Sau đó, nó chạy mã có trong tệp đã nhập

Nhưng lần này nó được đặt thành nameScript. Một lần nữa các câu lệnh def cho main và myFunction được chạy. Nhưng, bây giờ điều kiện đánh giá là sai và chính không được gọi

Trong importScript. py chúng tôi gọi myFunction sẽ xuất ra nameScript. NameScript được biết đến với myFunction khi chức năng đó được xác định

Nếu bạn in __name__ trong bản nhập khẩu, điều này sẽ xuất ra __main__. Lý do cho điều này là Python sử dụng giá trị đã biết trong phạm vi của importScript

Phần kết luận

Trong bài viết ngắn này, tôi đã giải thích cách bạn có thể sử dụng biến __name__ để viết các mô-đun. Bạn cũng có thể tự chạy các mô-đun này. Điều này có thể được thực hiện bằng cách sử dụng giá trị của các biến này thay đổi như thế nào tùy thuộc vào nơi chúng xuất hiện.

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO


__ __ Python nghĩa là gì?
Bert Carremans

Nhà khoa học dữ liệu


Nếu bài viết này hữu ích, hãy tweet nó

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu

Bài đăng này thảo luận về việc sử dụng ký tự _ trong Python. Giống như nhiều thứ trong Python, chúng ta sẽ thấy rằng các cách sử dụng khác nhau của _ hầu hết (không phải lúc nào cũng. ) một vấn đề của quy ước

Dấu gạch dưới đơn độc (_______51_______)

Điều này thường được sử dụng trong 3 trường hợp

  1. trong thông dịch viên. Tên _ trỏ đến kết quả của câu lệnh được thực thi cuối cùng trong phiên phiên dịch tương tác. Điều này lần đầu tiên được thực hiện bởi trình thông dịch CPython tiêu chuẩn và những người khác cũng đã làm theo

    >>> _
    Traceback (most recent call last):
      File "", line 1, in 
    NameError: name '_' is not defined
    >>> 42
    >>> _
    42
    >>> 'alright!' if _ else ':('
    'alright!'
    >>> _
    'alright!'
    
  2. như một cái tên. Điều này phần nào liên quan đến điểm trước. _ được sử dụng như một cái tên bỏ đi. Điều này sẽ cho phép người tiếp theo đọc mã của bạn biết rằng, theo quy ước, một tên nhất định được gán nhưng không có ý định sử dụng. Chẳng hạn, bạn có thể không quan tâm đến giá trị thực của bộ đếm vòng lặp

    n = 42
    for _ in range(n):
        do_something()
    
  3. i18n. Người ta cũng có thể thấy _ được sử dụng như một chức năng. Trong trường hợp đó, nó thường là tên được sử dụng cho hàm thực hiện tra cứu dịch chuỗi quốc tế hóa và bản địa hóa. Điều này dường như bắt nguồn từ và tuân theo quy ước C tương ứng
    Chẳng hạn, như đã thấy trong tài liệu dịch Django, bạn có thể có

    from django.utils.translation import ugettext as _
    from django.http import HttpResponse
    
    def my_view(request):
        output = _("Welcome to my site.")
        return HttpResponse(output)
    

Mục đích thứ hai và thứ ba có thể xung đột, vì vậy người ta nên tránh sử dụng _ như một cái tên vứt đi trong bất kỳ khối mã nào cũng sử dụng nó để tra cứu và dịch i18n

Dấu gạch dưới đơn trước tên (e. g.
n = 42
for _ in range(n):
    do_something()
3)

Một dấu gạch dưới trước một tên được sử dụng để xác định rằng tên đó sẽ được một lập trình viên coi là "riêng tư". Đó là một loại* quy ước để người tiếp theo (hoặc chính bạn) sử dụng mã của bạn biết rằng tên bắt đầu bằng _ là dành cho mục đích sử dụng nội bộ. Như

một tên bắt đầu bằng dấu gạch dưới (e. g.

n = 42
for _ in range(n):
    do_something()
5) nên được coi là một phần không công khai của API (cho dù đó là một hàm, một phương thức hay một thành viên dữ liệu). Nó nên được coi là một chi tiết thực hiện và có thể thay đổi mà không cần thông báo

* Tôi nói loại quy ước bởi vì nó thực sự có ý nghĩa gì đó đối với người phiên dịch; . Xem “Nhập

n = 42
for _ in range(n):
    do_something()
9 bằng Python” để biết thêm về điều này

Dấu gạch dưới kép trước tên (e. g.
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
0)

Việc sử dụng dấu gạch dưới kép (

from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
1) trước tên (cụ thể là tên phương thức) không phải là quy ước; . Python sắp xếp các tên này và nó được sử dụng để tránh xung đột tên với các tên được xác định bởi các lớp con. Vì , bất kỳ mã định danh nào có dạng
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
2 (ít nhất hai dấu gạch dưới ở đầu, nhiều nhất là một dấu gạch dưới ở cuối) được thay thế bằng văn bản bằng
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
3, trong đó
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
4 là tên lớp hiện tại với (các) dấu gạch dưới ở đầu bị loại bỏ

Lấy ví dụ sau

>>> class A(object):
..     def _internal_use(self):
..         pass
..     def __method_name(self):
..         pass
.. 
>>> dir(A())
['_A__method_name', ..., '_internal_use']

Đúng như mong đợi,

from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
5 không thay đổi nhưng
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
6 bị xáo trộn thành
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
7. Bây giờ, nếu bạn tạo một lớp con của
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
8, hãy nói
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
9 (argh, bad, bad names. ) thì bạn không thể dễ dàng ghi đè lên
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
6 của
from django.utils.translation import ugettext as _
from django.http import HttpResponse

def my_view(request):
    output = _("Welcome to my site.")
    return HttpResponse(output)
8

>>> class B(A):
..     def __method_name(self):
..         pass
.. 
>>> dir(B())
['_A__method_name', '_B__method_name', ..., '_internal_use']

Hành vi dự định ở đây gần như tương đương với các phương thức

>>> class A(object):
..     def _internal_use(self):
..         pass
..     def __method_name(self):
..         pass
.. 
>>> dir(A())
['_A__method_name', ..., '_internal_use']
2 trong Java và các phương thức thông thường (không ảo) trong C++

Dấu gạch dưới kép trước và sau tên (e. g.
>>> class A(object):
..     def _internal_use(self):
..         pass
..     def __method_name(self):
..         pass
.. 
>>> dir(A())
['_A__method_name', ..., '_internal_use']
3)

Chúng được sử dụng bởi Python. Đối với một người, đây chỉ là một quy ước, một cách để hệ thống Python sử dụng các tên không xung đột với tên do người dùng xác định. Sau đó, bạn thường ghi đè các phương thức này và xác định hành vi mong muốn khi Python gọi chúng. Ví dụ: bạn thường ghi đè phương thức

>>> class A(object):
..     def _internal_use(self):
..         pass
..     def __method_name(self):
..         pass
.. 
>>> dir(A())
['_A__method_name', ..., '_internal_use']
3 khi viết một lớp

Không có gì ngăn cản bạn viết tên trông giống như phương pháp đặc biệt của riêng bạn (nhưng, vui lòng không)

>>> class C(object):
..     def __mine__(self):
..         pass
...
>>> dir(C)
.. [..., '__mine__', ...]

Việc tránh xa kiểu đặt tên này sẽ dễ dàng hơn và chỉ để các tên đặc biệt do Python xác định tuân theo quy ước này

__ nghĩa là gì trong lớp Python?

Nếu bất kỳ lập trình viên nào đang xem mã hoặc xem lại mã, anh ta không được thay đổi mã đó. Biến này bắt đầu bằng “_” cho biết rằng biến này được sử dụng cho sử dụng nội bộ và tên biến sẽ được người lập trình coi là riêng tư. “_eggs” là các biến có nghĩa là nó chỉ được sử dụng nội bộ.

__ có nghĩa là gì trong Python?

1. Sử dụng trong Phiên dịch. Python tự động lưu giá trị của biểu thức cuối cùng trong trình thông dịch vào một biến cụ thể được gọi là "_. " Bạn cũng có thể gán các giá trị này cho một biến khác nếu muốn.

Hàm __ __ có nghĩa là gì trong Python?

Trong Python, việc sử dụng dấu gạch dưới trong tên hàm cho biết rằng hàm này dành cho mục đích sử dụng nội bộ và người dùng không nên gọi trực tiếp. It is a convention used to indicate that the function is "private" and not part of the public API of the module.

Tại sao lại sử dụng __ trong Python?

Việc sử dụng dấu gạch dưới kép ( __ ) trước tên (cụ thể là tên phương thức) không phải là quy ước; . Python xáo trộn các tên này và nó được sử dụng để tránh xung đột tên với các tên được xác định bởi các lớp con .