Hướng dẫn how do you access an object from another module in python? - làm thế nào để bạn truy cập một đối tượng từ một mô-đun khác trong python?

Vâng, bạn nên đưa ra điều này. Những gì bạn đã thử là nhập vòng tròn giữa các mô -đun của bạn và điều đó thường gây ra nhiều vấn đề hơn nó giải quyết. Nếu

from common import some_method_in_common
x = some_method_in_common()
9 nhập
from common import *
y = SomeClass()
0 và
from common import *
y = SomeClass()
0 nhập
from common import some_method_in_common
x = some_method_in_common()
9, thì bạn có thể gặp lỗi vì một số định nghĩa đối tượng sẽ bị thiếu từ
from common import *
y = SomeClass()
0 khi bạn cố gắng nhập chúng. Điều này là do
from common import *
y = SomeClass()
0 sẽ không hoàn tất việc thực thi khi
from common import some_method_in_common
x = some_method_in_common()
9 bắt đầu thực hiện để nhập. Giả sử
from common import *
y = SomeClass()
0 là tập lệnh khởi động của bạn, nó không nên làm gì hơn là bắt đầu chương trình bằng cách gọi một phương thức từ một mô -đun khác; Nó có thể khởi tạo một đối tượng nếu phương thức mong muốn là một phương thức thể hiện trên một lớp. Tránh các biến toàn cầu, quá. Ngay cả khi có vẻ như chúng sẽ không phải là vấn đề, điều đó có thể cắn bạn sau này.

Điều đó nói rằng, bạn có thể tham khảo các thành viên của một mô -đun như vậy:

import common
x = common.some_method_in_common()
y = common.SomeClass()

hoặc

from common import SomeClass
y = SomeClass()

Cá nhân, tôi thường tránh tham khảo một phương thức từ một mô -đun khác mà không đủ điều kiện với tên mô -đun, nhưng điều này cũng hợp pháp:

from common import some_method_in_common
x = some_method_in_common()

Tôi thường sử dụng

from common import *
y = SomeClass()
7 cho các lớp và tôi thường sử dụng biểu mẫu đầu tiên cho các phương thức. (Có, điều này đôi khi có nghĩa là tôi có nhập lớp cụ thể từ một mô -đun ngoài việc nhập chính mô -đun.) Nhưng đây chỉ là quy ước cá nhân của tôi.

Một cú pháp thay thế trong đó không được khuyến khích mạnh mẽ là

from common import *
y = SomeClass()

Điều này sẽ nhập mọi thành viên của Common vào phạm vi hiện tại không bắt đầu với dấu gạch dưới (

from common import *
y = SomeClass()
8). Lý do nó không được khuyến khích là vì nó làm cho việc xác định nguồn gốc của cái tên khó hơn và nó làm cho việc phá vỡ mọi thứ quá dễ dàng. Xem xét cặp nhập khẩu này:

from common import *
from some_other_module import *
y = SomeClass()

Mô -đun nào

from common import *
y = SomeClass()
9 đến từ? Không có cách nào để nói ngoài việc đi xem hai mô -đun. Tồi tệ hơn, điều gì sẽ xảy ra nếu cả hai mô -đun xác định
from common import *
y = SomeClass()
9 hoặc
from common import *
y = SomeClass()
9 sau đó được thêm vào
from common import *
from some_other_module import *
y = SomeClass()
2?both modules define
from common import *
y = SomeClass()
9 or
from common import *
y = SomeClass()
9 is later added to
from common import *
from some_other_module import *
y = SomeClass()
2?


Đây về cơ bản là ý tưởng của một đối tượng singleton. Vì vậy, nếu bạn đã khởi tạo một obect và muốn truy cập nó qua các mô -đun khác nhau, bạn có thể sử dụng 2 cách tiếp cận, trước tiên là bạn gán biến đó cho mô -đun bạn đã nhập dưới một tên biến. Ví dụ: bạn có một đối tượng myobj khởi tạo và muốn sử dụng nó với mô -đun B, sau đó bạn có thể làm như sau:

>>> import B
>>> B.myobj = myobj

Và bên trong mô -đun B, sử dụng nó như bất kỳ tài sản toàn cầu nào khác. Một cách khác là chấp nhận đối tượng này như một tham số bất cứ nơi nào cần thiết. Ví dụ: nếu bạn có một hàm myfunc trong mô -đun B yêu cầu đối tượng này, bạn có thể thực hiện như sau,

>>> import B
>>> B.myfunc(myobj)

Hướng dẫn how do you access an object from another module in python? - làm thế nào để bạn truy cập một đối tượng từ một mô-đun khác trong python?

Cập nhật vào ngày 01 tháng 10 năm 2019 11:28:14

  • Câu hỏi và câu trả lời liên quan
  • Làm thế nào để cấm một mô -đun Python gọi các mô -đun khác?
  • Làm thế nào để kiểm tra phiên bản của các mô -đun Python?
  • Chương trình để làm cho tên tệp độc đáo bằng Python
  • Làm thế nào để làm cho một cặp cột độc đáo trong MySQL?
  • Làm thế nào để tạo ra một lĩnh vực độc đáo trong MongoDB?
  • Làm thế nào để làm cho một trường hiện có trở nên độc đáo trong MySQL?
  • Làm thế nào để sử dụng các mô -đun Python từ xa?
  • Làm thế nào để cài đặt các mô -đun Python trong Cygwin?
  • Làm thế nào để truy cập các đối tượng Python trong các đối tượng trong Python?
  • Làm thế nào để sử dụng gạo nấu sẵn để làm các món ăn khác?
  • Các mô -đun Python hoạt động như thế nào?
  • Chương trình tìm số lượng hoạt động tối thiểu cần thiết để tạo một chuỗi chuỗi khác trong Python
  • Làm thế nào để triển khai các mô -đun Python trên Heroku?
  • Tăng tối thiểu để làm cho mảng duy nhất trong C ++
  • Tải lại các mô -đun trong Python?

Phán quyết

Giống như một số ngôn ngữ kịch bản khác, Python phân tích mức độ bên ngoài của mỗi mô -đun là mã thông thường. Các câu lệnh, biểu thức, biểu thức, và thậm chí các vòng lặp và điều kiện sẽ thực thi khi mô-đun được nhập. Điều này mang đến một cơ hội tuyệt vời để bổ sung các lớp và chức năng của một mô-đun với các hằng số và cấu trúc dữ liệu mà người gọi sẽ thấy hữu ích-nhưng cũng cung cấp những cám dỗ nguy hiểm: các đối tượng toàn cầu có thể thay đổi có thể kết nối mã xa và hoạt động I/O áp đặt chi phí thời gian nhập khẩu và phản ứng phụ.

Mỗi mô -đun Python là một không gian tên riêng. A & NBSP; Mô -đun như

from common import *
from some_other_module import *
y = SomeClass()
3 có thể cung cấp chức năng
from common import *
from some_other_module import *
y = SomeClass()
4 mà không mâu thuẫn với, thay thế hoặc ghi đè hàm
from common import *
from some_other_module import *
y = SomeClass()
4 hoàn toàn khác nhau được xác định trong mô -đun
from common import *
from some_other_module import *
y = SomeClass()
6.

Không gian tên riêng biệt là rất quan trọng để tạo ra một ngôn ngữ lập trình có thể điều khiển được. Nếu các mô -đun Python không phải là không gian tên riêng biệt, bạn sẽ không thể đọc hoặc viết mã Python bằng cách giữ sự chú ý của bạn tập trung vào mô -đun trước mặt bạn - một dòng mã có thể sử dụng hoặc vô tình xung đột với Thư viện tiêu chuẩn hoặc mô-đun của bên thứ ba bạn đã cài đặt. Nâng cấp mô-đun của bên thứ ba có thể phá vỡ toàn bộ chương trình của bạn nếu phiên bản mới xác định một toàn cầu mới mâu thuẫn với bạn. Các lập trình viên bị buộc phải viết mã bằng ngôn ngữ mà không có không gian tên sớm thấy mình gây ra những cái tên toàn cầu với tiền tố, hậu tố và dấu câu thêm trong một cuộc đua tuyệt vọng để giữ cho họ không mâu thuẫn.

Mặc dù mọi chức năng và lớp, tất nhiên, là một đối tượng - trong Python, mọi thứ đều là một đối tượng - mô hình toàn cầu mô -đun cụ thể đề cập đến các trường hợp đối tượng bình thường được đặt tên ở cấp độ toàn cầu của một mô -đun.

Hai mẫu sử dụng mô -đun toàn cầu nhưng đủ quan trọng để đảm bảo các bài viết của riêng họ:

  • Các phương thức tiền đề được tạo khi một mô -đun xây dựng một đối tượng và sau đó gán một hoặc nhiều phương thức ràng buộc đối tượng của đối tượng để đặt tên ở cấp độ toàn cầu của mô -đun. Các tên có thể được sử dụng để gọi các phương thức sau mà không cần phải tự tìm thấy đối tượng. are generated when a module builds an object and then assigns one or more of the object’s bound methods to names at the module’s global level. The names can be used to call the methods later without needing to find the object itself.
  • Mặc dù một đối tượng Sentinel không phải sống trong không gian tên toàn cầu của một mô -đun - một số đối tượng Sentinel được định nghĩa là thuộc tính lớp, trong khi những đối tượng khác là riêng tư và sống bên trong một đóng cửa - nhiều Sentinels, cả trong thư viện tiêu chuẩn và hơn thế nữa, được xác định và Truy cập như mô -đun toàn cầu.Sentinel Object doesn’t have to live in a module’s global namespace — some sentinel objects are defined as class attributes, while others are private and live inside of a closure — many sentinels, both in the Standard Library and beyond, are defined and accessed as module globals.

Bài viết này sẽ bao gồm một số trường hợp phổ biến khác.

Mẫu không đổi

Các mô -đun thường gán số hữu ích, chuỗi và các giá trị khác cho tên trong phạm vi toàn cầu của chúng. Thư viện tiêu chuẩn bao gồm nhiều bài tập như vậy, từ đó chúng tôi có thể trích xuất một vài ví dụ.

January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py

Hãy nhớ rằng đây là những hằng số của người Viking chỉ theo nghĩa là các đối tượng là bất biến. Các tên vẫn có thể được chỉ định lại.

import calendar
calendar.January = 13
print(calendar.January)

Hoặc bị xóa, cho vấn đề đó.

del calendar.January
print(calendar.January)

from common import SomeClass
y = SomeClass()
0

Ngoài các số nguyên, phao và dây, các hằng số còn bao gồm các thùng chứa bất biến như bộ dữ liệu và bộ đông lạnh:

from common import SomeClass
y = SomeClass()
1

Các loại dữ liệu bất biến chuyên biệt hơn cũng đóng vai trò là hằng số:

from common import SomeClass
y = SomeClass()
2

Trong những dịp hiếm hoi, một mô -đun toàn cầu mà mã rõ ràng không bao giờ có ý định sửa đổi sử dụng cấu trúc dữ liệu có thể thay đổi. Các bộ có thể thay đổi đơn giản là phổ biến trong mã trước khi phát minh ra

from common import *
from some_other_module import *
y = SomeClass()
7. Từ điển vẫn được sử dụng cho đến ngày nay bởi vì, than ôi, thư viện tiêu chuẩn không cung cấp một từ điển đóng băng.

from common import SomeClass
y = SomeClass()
3

from common import SomeClass
y = SomeClass()
4

Các hằng số thường được giới thiệu dưới dạng tái cấu trúc: lập trình viên thông báo rằng cùng một giá trị

from common import *
from some_other_module import *
y = SomeClass()
8 xuất hiện nhiều lần trong mã của chúng và do đó giới thiệu hằng số
from common import *
from some_other_module import *
y = SomeClass()
9 cho giá trị thay thế. Mỗi cách sử dụng tên bây giờ sẽ phải chịu chi phí nhỏ của việc tìm kiếm vào phạm vi toàn cầu, nhưng điều này được cân bằng bởi một vài lợi thế. Tên liên tục hiện nay ghi lại ý nghĩa của giá trị, cải thiện khả năng đọc của mã. Và câu lệnh gán không liên tục hiện cung cấp một vị trí duy nhất trong đó giá trị có thể được chỉnh sửa trong tương lai mà không cần phải sử dụng mã cho mỗi nơi
from common import *
from some_other_module import *
y = SomeClass()
8 được sử dụng.

Những lợi thế này đủ trọng lượng để đôi khi một hằng số được giới thiệu ngay cả đối với một giá trị mà chỉ sử dụng một lần, nâng một nghĩa đen được ẩn sâu trong mã vào khả năng hiển thị như một toàn cầu.

Một số lập trình viên đặt các bài tập không đổi gần với mã sử dụng chúng; Những người khác đặt tất cả các hằng số ở đầu tệp. Trừ khi một hằng số được đặt rất gần với mã của nó đến nỗi nó sẽ luôn luôn theo quan điểm của người đọc con người, thì việc đặt các hằng số ở đầu mô -đun có thể thân thiện hơn Hỗ trợ chuyển đổi để định nghĩa.

Một loại hằng số khác không được hướng vào bên trong, hướng tới mã trong chính mô -đun, mà ra ngoài như là một phần của API mô -đun được quảng cáo. A & nbsp; hằng số như

>>> import B
>>> B.myobj = myobj
1 từ mô -đun
>>> import B
>>> B.myobj = myobj
2 cung cấp các lợi thế của hằng số cho người gọi: mã sẽ dễ đọc hơn và giá trị không đổi có thể được điều chỉnh sau này mà không cần người gọi nào cần chỉnh sửa mã của họ.

Bạn có thể mong đợi rằng một không đổi dành cho việc sử dụng mô -đun, nhưng không dành cho người gọi, sẽ luôn bắt đầu với một dấu gạch dưới để đánh dấu nó riêng tư. Nhưng các lập trình viên Python không nhất quán trong việc đánh dấu các hằng số, có lẽ vì chi phí cần phải giữ một liên tục mãi mãi vì người gọi có thể đã quyết định sử dụng nó nhỏ hơn chi phí có chức năng trợ giúp hoặc API Lớp API mãi mãi bị khóa.

Tính toán thời gian nhập khẩu

Đôi khi các hằng số được giới thiệu cho hiệu quả, để tránh tính toán lại một giá trị mỗi khi mã thời gian được gọi. Ví dụ, mặc dù các hoạt động toán học liên quan đến các số theo nghĩa đen trên thực tế được tối ưu hóa trong tất cả các triển khai Python hiện đại, các nhà phát triển vẫn thường cảm thấy thoải mái hơn khi nói rõ rằng toán học nên được thực hiện vào thời điểm nhập bằng cách gán kết quả cho một mô -đun toàn cầu:

from common import SomeClass
y = SomeClass()
5

Khi biểu thức toán học phức tạp, việc gán một tên cũng tăng cường khả năng đọc của mã.

Một ví dụ khác, có tồn tại các giá trị điểm nổi đặc biệt không thể được viết bằng Python như nghĩa đen; Chúng chỉ có thể được tạo bằng cách chuyển một chuỗi cho loại float. Để tránh gọi

>>> import B
>>> B.myobj = myobj
3 với
>>> import B
>>> B.myobj = myobj
4 hoặc
>>> import B
>>> B.myobj = myobj
5 mỗi lần cần giá trị đó, các mô -đun thường chỉ xây dựng các giá trị đó một lần như mô -đun toàn cầu.

from common import SomeClass
y = SomeClass()
6

Một hằng số cũng có thể nắm bắt được kết quả của một điều kiện để tránh đánh giá lại mỗi lần giá trị cần thiết-tất nhiên, vì điều kiện sẽ thay đổi trong khi chương trình đang chạy.

from common import SomeClass
y = SomeClass()
7

Ví dụ yêu thích của tôi về các hằng số được tính toán trong thư viện tiêu chuẩn là mô -đun

>>> import B
>>> B.myobj = myobj
6. I & NBSP; luôn cho rằng nó đã được triển khai trong C, để có quyền truy cập đặc biệt vào các đối tượng loại tích hợp như
>>> import B
>>> B.myobj = myobj
7 và
>>> import B
>>> B.myobj = myobj
8 được xác định bởi chính việc thực hiện ngôn ngữ.

Hóa ra? Tôi & nbsp; đã sai. Mô -đun

>>> import B
>>> B.myobj = myobj
6 được viết bằng Python đơn giản!

Nếu không có bất kỳ quyền truy cập đặc biệt nào vào nội bộ ngôn ngữ, nó sẽ làm những gì mà bất cứ ai khác sẽ làm để tìm hiểu loại chức năng nào có. Nó tạo ra một hàm, sau đó hỏi loại của nó:

from common import SomeClass
y = SomeClass()
8

Một mặt, điều này làm cho mô -đun

>>> import B
>>> B.myobj = myobj
6 có vẻ gần như không cần thiết - bạn luôn có thể sử dụng cùng một thủ thuật để khám phá
>>> import B
>>> B.myobj = myobj
7. Nhưng mặt khác, việc nhập nó từ
>>> import B
>>> B.myobj = myobj
6 cho phép cả hai lợi ích chính của mô hình không đổi tỏa sáng: mã trở nên dễ đọc hơn vì
>>> import B
>>> B.myobj = myobj
7 sẽ có cùng tên ở khắp mọi nơi và hiệu quả hơn vì hằng số chỉ cần được tính toán khi có bao nhiêu mô -đun Trong một hệ thống lớn có thể sử dụng nó.

Hằng số nhảm nhợt

Một trường hợp đặc biệt của các hằng số được xác định ở cấp độ toàn cầu của mô -đun là các hằng số Dunder, có tên bắt đầu và kết thúc với các dấu gạch dưới gấp đôi.

Một số hằng số Dunder toàn cầu được đặt bởi chính ngôn ngữ. Đối với danh sách chính thức, hãy tìm kiếm các mô -đun của các mô -đun trong phần tham chiếu Python trên hệ thống phân cấp loại tiêu chuẩn. Hai người gặp phải thường xuyên nhất là

>>> import B
>>> B.myfunc(myobj)
4, mà các chương trình cần kiểm tra vì quyết định thiết kế khủng khiếp của Python để gán tên giả
>>> import B
>>> B.myfunc(myobj)
5 cho mô -đun được gọi từ dòng lệnh và
>>> import B
>>> B.myfunc(myobj)
6, đường dẫn hệ thống tập tin đầy đủ đến tệp python của mô -đun - đó là Hầu như được sử dụng phổ biến để tìm các tệp dữ liệu có trong một gói, mặc dù khuyến nghị chính thức ngày nay là sử dụng
>>> import B
>>> B.myfunc(myobj)
7 thay thế.

from common import SomeClass
y = SomeClass()
9

Ngoài các hằng số Dunder được đặt bởi thời gian chạy ngôn ngữ, có một Python nhận ra nếu một mô -đun chọn đặt nó: Nếu

>>> import B
>>> B.myfunc(myobj)
8 được gán một chuỗi các định danh, thì chỉ có những tên đó sẽ được nhập vào một mô -đun khác thực hiện
>>> import B
>>> B.myfunc(myobj)
9. Bạn có thể dự kiến ​​
>>> import B
>>> B.myfunc(myobj)
8 sẽ trở nên ít phổ biến hơn vì
January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
1 đã nổi tiếng như một người chống lại, nhưng nó đã đạt được sự nghiệp thứ hai hạnh phúc giới hạn danh sách các biểu tượng được bao gồm bởi các công cụ tài liệu tự động như SPHINX AutoDoc Module.

Mặc dù hầu hết các mô -đun không bao giờ có kế hoạch sửa đổi

>>> import B
>>> B.myfunc(myobj)
8, nhưng chúng chỉ định nó một cách không thể giải thích được là một danh sách python. Nó là thanh lịch hơn để sử dụng một tuple.

Ngoài những hằng số chính thức này, một số mô -đun - mặc dù không hấp dẫn có bao nhiêu người tìm thấy tên dunder - thưởng thức việc tạo ra nhiều hơn nữa. Các bài tập cho các tên như

January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
3 và
January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
4 nằm rải rác trên thư viện tiêu chuẩn và hơn thế nữa. Mặc dù họ không thể xuất hiện một cách nhất quán để công cụ có thể giả định sự hiện diện của họ, nhưng người đọc thỉnh thoảng có thể thấy họ có nhiều thông tin và họ dễ dàng hơn để có được hơn so với siêu dữ liệu chính thức.

Coi chừng rằng dường như không có sự đồng ý, ngay cả trong thư viện tiêu chuẩn, về loại

January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
3 nên có.

from common import some_method_in_common
x = some_method_in_common()
0

from common import some_method_in_common
x = some_method_in_common()
1

Tại sao không phải là

January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
6 và
January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
7, mà không có Dunders? Một người đọc sớm có lẽ đã hiểu lầm Dunders, điều này thực sự có nghĩa là đặc biệt đối với thời gian chạy ngôn ngữ Python, là một dấu hiệu mơ hồ rằng một giá trị là siêu dữ liệu thay vì mã mô -đun. A & nbsp; Rất ít mô -đun thư viện tiêu chuẩn cung cấp phiên bản của họ mà không cần Dunders, nhưng thậm chí không đồng ý về việc viết hoa.

from common import some_method_in_common
x = some_method_in_common()
2

Để tránh sự không nhất quán xung quanh các quy ước siêu dữ liệu không chính thức và ad-hoc này, một gói dự kiến ​​sẽ được cài đặt với

January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
8 có thể tìm hiểu tên và phiên bản của các gói được cài đặt khác trực tiếp từ hệ thống cài đặt gói Python. Thông tin thêm có sẵn trong tài liệu Setuptools trên mô -đun
January = 1                   # calendar.py
WARNING = 30                  # logging.py
MAX_INTERPOLATION_DEPTH = 10  # configparser.py
SSL_HANDSHAKE_TIMEOUT = 60.0  # asyncio.constants.py
TICK = "'"                    # email.utils.py
CRLF = "\r\n"                 # smtplib.py
9.

Mẫu đối tượng toàn cầu

Trong mẫu đối tượng toàn cầu đầy đủ, như trong mẫu không đổi, một mô-đun sẽ tạo ra một đối tượng tại thời điểm nhập và gán cho nó một tên trong phạm vi toàn cầu của mô-đun. Nhưng đối tượng không chỉ đơn giản là dữ liệu; Nó không chỉ đơn thuần là một cấu trúc số nguyên, chuỗi hoặc dữ liệu. Thay vào đó, đối tượng được cung cấp vì lợi ích của các phương pháp mà nó cung cấp - cho các hành động mà nó có thể thực hiện.

Các đối tượng toàn cầu đơn giản nhất là bất biến. A & nbsp; Ví dụ phổ biến là một biểu thức thông thường được biên dịch - đây là một vài ví dụ từ thư viện tiêu chuẩn:

from common import some_method_in_common
x = some_method_in_common()
3

Biên soạn một biểu thức chính quy như một mô -đun toàn cầu là một ví dụ tốt về mẫu đối tượng toàn cầu nói chung hơn. Nó đạt được một khoản chuyển chi phí thanh lịch và an toàn từ sau này trong thời gian chạy của chương trình để nhập thời gian nhập khẩu. Sự đánh đổi là:

  • Chi phí nhập mô -đun tăng theo chi phí biên dịch biểu thức thông thường (cộng với chi phí nhỏ khi gán nó cho một tên toàn cầu).
  • Chi phí thời gian nhập khẩu hiện được sinh ra bởi mọi chương trình nhập mô-đun. Ngay cả khi một chương trình không xảy ra để gọi bất kỳ mã nào sử dụng biểu thức chính quy
    import calendar
    calendar.January = 13
    print(calendar.January)
    
    0 được hiển thị ở trên, nó sẽ phải chịu chi phí biên dịch nó bất cứ khi nào nó nhập mô -đun
    from common import *
    from some_other_module import *
    y = SomeClass()
    
    3. . ?)
  • Nhưng trên thực tế, các chức năng và phương pháp cần sử dụng biểu thức thông thường sẽ không còn phải chịu chi phí lặp đi lặp lại cho việc biên dịch của nó. Biểu thức chính quy được biên dịch đã sẵn sàng để bắt đầu quét một chuỗi ngay lập tức! Nếu biểu thức chính quy được sử dụng thường xuyên, như trong vòng bên trong của một hoạt động tốn kém như phân tích cú pháp, tiết kiệm có thể là đáng kể.
  • Tên toàn cầu sẽ làm cho mã gọi dễ đọc hơn nếu biểu thức chính quy, khi được sử dụng cục bộ, được sử dụng ẩn danh trong một biểu thức lớn hơn. .

Danh sách đánh đổi này là giống nhau, nếu bạn chuyển một biểu thức thông thường ra một thuộc tính lớp thay vì di chuyển tất cả các cách ra phạm vi toàn cầu. Cuối cùng khi tôi viết về việc viết về Python và các lớp học, tôi sẽ liên kết từ đây với những suy nghĩ tiếp theo về các thuộc tính của lớp.

Các đối tượng toàn cầu có thể thay đổi

Nhưng những gì về các đối tượng toàn cầu có thể thay đổi?

Họ dễ nhất là biện minh khi kết thúc các tài nguyên hệ thống theo bản chất của chúng cũng toàn cầu cho một quy trình hệ điều hành. Một ví dụ trong thư viện tiêu chuẩn là đối tượng

import calendar
calendar.January = 13
print(calendar.January)
3 cung cấp cho chương trình Python của bạn môi trường của bạn - các khóa và giá trị văn bản cung cấp thời gian của bạn, loại thiết bị đầu cuối của bạn, do đó, được chuyển cho chương trình Python của bạn từ quy trình mẹ của nó.

Bây giờ, có thể tranh luận liệu chương trình của bạn có thực sự viết các giá trị mới vào môi trường của nó khi nó chạy hay không. Nếu bạn đang khởi chạy một quy trình con cần một biến môi trường được điều chỉnh, các thói quen

import calendar
calendar.January = 13
print(calendar.January)
4 cung cấp một tham số
import calendar
calendar.January = 13
print(calendar.January)
5. Nhưng nếu mã không cần điều khiển tài nguyên toàn cầu này, thì điều đó có ý nghĩa khi quyền truy cập đó được trung gian bởi một đối tượng Python toàn cầu tương ứng:

from common import some_method_in_common
x = some_method_in_common()
4

Thông qua đối tượng toàn cầu này, các thói quen khác nhau và có lẽ là các chủ đề, trong một chương trình Python phối hợp quyền truy cập của họ vào tài nguyên toàn quy trình này. Bất kỳ & nbsp; thay đổi:

from common import some_method_in_common
x = some_method_in_common()
5

- sẽ được hiển thị ngay lập tức cho bất kỳ phần nào khác của chương trình đọc khóa môi trường đó:

from common import some_method_in_common
x = some_method_in_common()
6

Các vấn đề với các phần xa khớp của cơ sở mã của bạn và thậm chí các phần không liên quan của các thư viện khác nhau, thông qua một đối tượng toàn cầu độc đáo cũng được biết đến.

  • Các thử nghiệm trước đây độc lập đột nhiên được ghép nối thông qua đối tượng toàn cầu và không còn có thể chạy song song một cách an toàn. Nếu một thử nghiệm thực hiện một nhiệm vụ tạm thời cho
    import calendar
    calendar.January = 13
    print(calendar.January)
    
    6 ngay trước khi một thử nghiệm khác khởi chạy nhị phân với
    import calendar
    calendar.January = 13
    print(calendar.January)
    
    4, nhị phân sẽ kế thừa giá trị thử nghiệm của
    import calendar
    calendar.January = 13
    print(calendar.January)
    
    8 - có thể gây ra lỗi.
  • Đôi khi bạn có thể tuần tự hóa quyền truy cập vào một đối tượng toàn cầu thông qua một khóa. Nhưng trừ khi bạn thực hiện kiểm toán kỹ lưỡng tất cả các thư viện mà mã của bạn sử dụng và tiếp tục kiểm toán chúng khi nâng cấp lên các phiên bản mới, có thể khó có thể biết được mã kiểm tra nào cuối cùng chạm vào đối tượng toàn cầu cụ thể như
    import calendar
    calendar.January = 13
    print(calendar.January)
    
    3.
  • Ngay cả các bài kiểm tra chạy huyết thanh, không song song, giờ đây sẽ kết hợp với nhau nếu một thử nghiệm không thể khôi phục
    import calendar
    calendar.January = 13
    print(calendar.January)
    
    3 về trạng thái ban đầu trước khi thử nghiệm tiếp theo chạy. Điều này có thể, nó đúng, được giảm thiểu với các thói quen phá vỡ hoặc với các chế giễu tự động khôi phục trạng thái. Nhưng trừ khi mỗi bài kiểm tra hoàn toàn thận trọng, bộ thử nghiệm của bạn vẫn có thể bị các ngoại lệ phụ thuộc vào thứ tự thử nghiệm ngẫu nhiên hay vào việc thử nghiệm trước đó đã thành công hay thoát sớm.
  • Những nguy hiểm này không chỉ kiểm tra mà còn sản xuất. Ngay cả khi ứng dụng của bạn không khởi chạy nhiều luồng, có thể có những trường hợp đáng ngạc nhiên khi việc tái cấu trúc mã sẽ thực hiện một hoạt động trên
    import calendar
    calendar.January = 13
    print(calendar.January)
    
    3 ngay giữa một thói quen khác cũng ở giữa chuyển đổi trạng thái của nó.

Thư viện tiêu chuẩn có nhiều ví dụ hơn về mô hình toàn cầu có thể thay đổi - cả toàn cầu công cộng và tư nhân đều xả rác các mô -đun. Một số tương ứng với các tài nguyên duy nhất ở cấp hệ thống:

from common import some_method_in_common
x = some_method_in_common()
7

Những người khác tương ứng với không có tài nguyên bên ngoài mà thay vào đó đóng vai trò là điểm phối hợp duy nhất cho hoạt động toàn quy trình như ghi nhật ký:

from common import some_method_in_common
x = some_method_in_common()
8

Các thư viện của bên thứ ba có thể cung cấp hàng tá ví dụ hơn, từ các nhóm chủ đề HTTP toàn cầu và kết nối cơ sở dữ liệu đến các cơ quan đăng ký của trình xử lý yêu cầu, plugin thư viện và codec bên thứ ba. Nhưng trong mọi trường hợp, các tòa án toàn cầu có thể thay đổi, tất cả các nguy hiểm được liệt kê ở trên để đổi lấy sự thuận tiện của việc đặt một tài nguyên nơi mọi mô -đun có thể đạt được nó.

Lời khuyên của tôi, đến mức bạn có thể, là viết mã chấp nhận các đối số và trả về các giá trị được tính toán từ chúng. Không điều đó, hãy thử chuyển các kết nối cơ sở dữ liệu hoặc mở ổ cắm để mã sẽ cần tương tác với thế giới bên ngoài. Đó là một sự thỏa hiệp cho mã tìm thấy chính nó bị mắc kẹt từ các tài nguyên cần thiết để sử dụng để truy cập toàn cầu.

Tất nhiên, vinh quang của Python là nó thường làm cho thậm chí các mô hình và thỏa hiệp đọc khá thanh lịch trong mã. Một câu lệnh gán ở cấp độ toàn cầu của một mô -đun cũng dễ viết và đọc như bất kỳ câu lệnh gán nào khác và người gọi có thể truy cập toàn cầu có thể thay đổi thông qua chính xác cùng một câu lệnh nhập mà họ sử dụng cho các chức năng và lớp.

Nhập thời gian I/O¶

Nhiều đối tượng toàn cầu tồi tệ nhất là những đối tượng thực hiện tệp hoặc mạng I/O tại thời điểm nhập. Họ không chỉ áp đặt chi phí cho I/O đó trên mỗi thư viện, tập lệnh và kiểm tra cần mô -đun, mà còn khiến chúng bị lỗi nếu không có tệp hoặc mạng.

Các tác giả thư viện có xu hướng đáng tiếc là đưa ra các giả định như là tệp

del calendar.January
print(calendar.January)
2 sẽ luôn tồn tại khi trên thực tế, họ không thể biết trước tất cả các môi trường kỳ lạ của họ sẽ phải đối mặt với một ngày nào đó - có thể là một hệ thống nhúng nhỏ mà trên thực tế thiếu tập tin đó; Có thể một môi trường tích hợp liên tục quay các container không có cấu hình mạng nào cả.

Ngay cả khi phải đối mặt với khả năng này, một tác giả mô-đun vẫn có thể cố gắng bảo vệ I/O thời gian nhập của họ Dù sao cũng sẽ nhận được chính xác ngoại lệ sau này. Nỗ lực đưa ra cái cớ này cho thấy ba hiểu lầm:

  1. Lỗi tại thời điểm nhập khẩu nghiêm trọng hơn nhiều so với lỗi khi chạy. Hãy nhớ rằng tại thời điểm này, gói của bạn được nhập, thói quen chính của chương trình có thể chưa bắt đầu chạy - người gọi thường vẫn ở giữa các câu lệnh
    del calendar.January
    print(calendar.January)
    
    4 ở đầu tệp của họ. Họ có thể chưa thiết lập ghi nhật ký và chưa nhập khối
    del calendar.January
    print(calendar.January)
    
    5 chính của họ, việc bắt và báo cáo thất bại, vì vậy bất kỳ lỗi nào trong quá trình nhập có thể sẽ in trực tiếp vào đầu ra tiêu chuẩn thay vì được báo cáo đúng.
  2. Các ứng dụng thường được viết để tồn tại sự thất bại của một số hoạt động để trong trường hợp khẩn cấp, chúng vẫn có thể thực hiện các chức năng khác. Ngay cả khi các tính năng cần thư viện của bạn bây giờ sẽ có một ngoại lệ, ứng dụng có thể có nhiều tính năng khác mà nó có thể tiếp tục cung cấp - hoặc có thể, nếu bạn đã giết nó với một ngoại lệ tại thời điểm nhập khẩu.
  3. Cuối cùng, các tác giả thư viện cần lưu ý rằng một chương trình Python nhập thư viện của họ thậm chí có thể không sử dụng nó! Không bao giờ cho rằng đơn giản là vì mã của bạn đã được nhập, nó sẽ được sử dụng. Có nhiều tình huống trong đó một mô -đun được nhập vào một cách tình cờ, vì sự phụ thuộc của các mô -đun tiếp theo, nhưng không bao giờ xảy ra để được gọi. Bằng cách thực hiện I/O tại thời điểm nhập khẩu, bạn có thể áp dụng chi phí và rủi ro cho hàng trăm chương trình và bài kiểm tra mà không cần hoặc quan tâm đến cổng mạng, nhóm kết nối hoặc tệp mở của bạn.

Vì tất cả những lý do này, tốt nhất là các đối tượng toàn cầu của bạn phải đợi cho đến khi chúng được gọi lần đầu tiên trước khi mở các tệp và tạo ổ cắm - bởi vì đó là lúc cuộc gọi đầu tiên mà thư viện biết chương trình chính hiện đang hoạt động, và Biết rằng các dịch vụ của nó trên thực tế là chắc chắn cần thiết trong hoạt động đặc biệt này của chương trình.

Tôi sẽ thừa nhận rằng, khi gói của tôi cần tải một tệp dữ liệu nhỏ mà chính được nhúng trong gói, đôi khi tôi phá vỡ quy tắc này.

Làm thế nào để bạn truy cập một mô -đun từ một mô -đun khác trong Python?

Mô -đun Python..
Lưu mã này trong một tệp có tên mymodule.py. ....
Nhập mô -đun có tên myModule và gọi hàm lời chào: ....
Lưu mã này trong tệp mymodule.py. ....
Nhập mô -đun có tên MyModule và truy cập từ điển Person1: ....
Tạo một bí danh cho mymodule được gọi là MX: ....
Nhập và sử dụng mô -đun nền tảng:.

Làm cách nào để truy cập một mô -đun Python?

Trong Python, các mô -đun được truy cập bằng cách sử dụng câu lệnh nhập.Khi bạn thực hiện điều này, bạn thực thi mã của mô -đun, giữ phạm vi của các định nghĩa để (các) tệp hiện tại của bạn có thể sử dụng chúng.using the import statement. When you do this, you execute the code of the module, keeping the scopes of the definitions so that your current file(s) can make use of these.

__ Mô -đun __ trong Python là gì?

Một mô -đun trong Python là một tệp (kết thúc bằng .py) chứa một tập hợp các định nghĩa (biến và hàm) mà bạn có thể sử dụng khi chúng được nhập.a file (ending in .py ) that contains a set of definitions (variables and functions) that you can use when they are imported.

Làm thế nào để bạn sử dụng nhập khẩu tương đối trong Python?

Nhập khẩu tương đối Sử dụng DOT (.) Ký hiệu để chỉ định vị trí.Một dấu chấm duy nhất chỉ định rằng mô -đun nằm trong thư mục hiện tại, hai dấu chấm chỉ ra rằng mô -đun nằm trong thư mục mẹ của vị trí hiện tại và ba dấu chấm cho thấy nó nằm trong thư mục ông bà, v.v.use dot(.) notation to specify a location. A single dot specifies that the module is in the current directory, two dots indicate that the module is in its parent directory of the current location and three dots indicate that it is in the grandparent directory and so on.