Hướng dẫn python access class attribute without instance - Thuộc tính lớp truy cập python không có phiên bản
Tôi đã tự hỏi nếu có thể sử dụng một thuộc tính của một lớp từ một tệp khác mà không tạo một đối tượng từ lớp đó, ví dụ, nếu tôi có class_a trong file_a và tôi nhập class_a vào file_b, tôi có phải sử dụng class_a làm đối tượng trong FILE_B để truy cập các thuộc tính của nó? Show
hỏi ngày 9 tháng 7 năm 2017 lúc 20:52Jul 9, 2017 at 20:52
2 Cách đơn giản nhất:
Bạn cũng có thể sử dụng thuộc tính __dict__:
Sử dụng Bộ trang trí StaticMethod nếu bạn cần sử dụng phương pháp:
Đã trả lời ngày 9 tháng 7 năm 2017 lúc 21:00Jul 9, 2017 at 21:00
SaypysaypySayPy 5364 Huy hiệu bạc13 Huy hiệu Đồng4 silver badges13 bronze badges 6 Thực sự không có lý do để tạo một đối tượng mới trong khác để sử dụng các thuộc tính và phương thức của một đối tượng khác. Bạn chỉ muốn tạo một phiên bản của class_a trong file_b để sử dụng các thuộc tính và phương thức của nó. Ví dụ:
Đọc thêm về OOP tại đây http://www.python-course.eu/object_oriented_programming.php Đã trả lời ngày 9 tháng 7 năm 2017 lúc 21:05Jul 9, 2017 at 21:05
Fortuneefressioneefortunee 3,4262 huy hiệu vàng16 Huy hiệu bạc24 Huy hiệu đồng2 gold badges16 silver badges24 bronze badges 2 Tôi đã có một cuộc phỏng vấn lập trình gần đây, một màn hình điện thoại trong đó chúng tôi đã sử dụng một trình soạn thảo văn bản hợp tác. Tôi đã được yêu cầu thực hiện một API nhất định và chọn làm như vậy trong Python. Tóm tắt về tuyên bố vấn đề, hãy nói rằng tôi cần một lớp có các trường hợp lưu trữ một số 7 và một số 8.Tôi hít một hơi thật sâu và bắt đầu gõ. Sau một vài dòng, tôi đã có một cái gì đó như thế này:
Người phỏng vấn của tôi đã ngăn tôi lại:
Để tham khảo và để cung cấp cho bạn một ý tưởng về những gì tôi sẽ làm, ở đây, cách tôi sửa đổi mã:
Hóa ra, cả hai chúng tôi đều sai. Câu trả lời thực sự nằm trong việc hiểu sự khác biệt giữa các thuộc tính lớp Python và các thuộc tính thể hiện Python. Lưu ý: Nếu bạn có một chuyên gia xử lý các thuộc tính của lớp, bạn có thể bỏ qua trước để sử dụng các trường hợp. Thuộc tính lớp PythonNgười phỏng vấn của tôi đã sai ở chỗ mã trên có hiệu lực về mặt cú pháp. Tôi cũng đã sai ở chỗ nó không phải là một giá trị mặc định của người dùng cho thuộc tính thể hiện. Thay vào đó, nó xác định 7 là thuộc tính lớp có giá trị 1.Theo kinh nghiệm của tôi, các thuộc tính lớp Python là một chủ đề mà nhiều người biết điều gì đó, nhưng ít ai hiểu hoàn toàn. Biến lớp Python so với biến thể hiện: Điều gì khác biệt?Một thuộc tính lớp Python là một thuộc tính của lớp (tròn, tôi biết), thay vì một thuộc tính của một thể hiện của một lớp. Hãy để sử dụng một ví dụ về lớp Python để minh họa sự khác biệt. Ở đây, 2 là thuộc tính lớp và 3 là một thuộc tính thể hiện:
Lưu ý rằng tất cả các trường hợp của lớp đều có quyền truy cập vào 2 và nó cũng có thể được truy cập dưới dạng thuộc tính của chính lớp:
Đối với các lập trình viên Java hoặc C ++, thuộc tính lớp tương tự nhưng không giống hệt với thành viên tĩnh. Chúng tôi sẽ thấy họ khác nhau như thế nào sau này. Không gian tên lớp so với trường hợpĐể hiểu những gì xảy ra ở đây, hãy để nói chuyện ngắn gọn về các không gian tên Python.Python namespaces. Một không gian tên là một ánh xạ từ tên đến các đối tượng, với thuộc tính không có mối quan hệ nào giữa các tên trong các không gian tên khác nhau. Họ thường được thực hiện dưới dạng từ điển Python, mặc dù điều này được trừu tượng hóa. Tùy thuộc vào ngữ cảnh, bạn có thể cần truy cập không gian tên bằng cú pháp DOT (ví dụ: 5) hoặc làm biến cục bộ (ví dụ: 6). Như một ví dụ cụ thể:
Các lớp Python và các trường hợp của các lớp mỗi lớp có các không gian tên riêng biệt được đại diện bởi các thuộc tính được xác định trước 7 và 8, tương ứng.Khi bạn cố gắng truy cập một thuộc tính từ một thể hiện của một lớp, trước tiên nó xem xét không gian tên thể hiện của nó. Nếu nó tìm thấy thuộc tính, nó sẽ trả về giá trị liên quan. Nếu không, sau đó nó nhìn vào không gian tên lớp và trả về thuộc tính (nếu nó có mặt, ném một lỗi khác). Ví dụ:
Không gian tên trường hợp có quyền tối cao đối với không gian tên lớp: Nếu có một thuộc tính có cùng tên trong cả hai, không gian tên trường hợp sẽ được kiểm tra trước và giá trị của nó được trả về. Tại đây, một phiên bản đơn giản hóa của mã (nguồn) để tra cứu thuộc tính: 0Và, ở dạng trực quan: Cách phân công thuộc tính lớpVới suy nghĩ này, chúng ta có thể hiểu được cách thức các thuộc tính lớp Python xử lý việc gán:
Tính đột biếnCâu hỏi câu hỏi: Điều gì sẽ xảy ra nếu thuộc tính lớp của bạn có một loại có thể thay đổi? Bạn có thể thao tác (cắt xén?) Thuộc tính lớp bằng cách truy cập nó thông qua một trường hợp cụ thể và đến lượt nó, kết thúc thao tác đối tượng được tham chiếu mà tất cả các trường hợp đang truy cập (như được chỉ ra bởi Timothy Wiseman).mutable type? You can manipulate (mutilate?) the class attribute by accessing it through a particular instance and, in turn, end up manipulating the referenced object that all instances are accessing (as pointed out by Timothy Wiseman). Điều này được thể hiện tốt nhất bằng ví dụ. Hãy để Lừa quay trở lại 1 mà tôi đã xác định trước đó và xem cách sử dụng biến lớp của tôi có thể dẫn đến các vấn đề xuống đường.
Mục tiêu của tôi là có danh sách trống ( 1) là giá trị mặc định cho 7 và cho mỗi trường hợp 1 để có dữ liệu riêng sẽ bị thay đổi theo thời gian trên cơ sở theo trường hợp. Nhưng trong trường hợp này, chúng tôi có được hành vi sau (nhớ lại rằng 1 có một số đối số 8, đó là tùy ý trong ví dụ này): 4Đây không phải là điều tốt, thay đổi biến lớp thông qua một trường hợp thay đổi nó cho tất cả các trường hợp khác! Ở cấp độ không gian tên, tất cả các trường hợp của 1 đang truy cập và sửa đổi cùng một danh sách trong 8 mà không cần tự tạo các thuộc tính 7 trong các không gian tên của chúng.Chúng tôi có thể hiểu được điều này bằng cách sử dụng bài tập; Đó là, thay vì khai thác danh sách đột biến, chúng tôi có thể gán các đối tượng 1 của chúng tôi để có danh sách riêng của chúng, như sau: 5Trong trường hợp này, chúng tôi đã thêm 1, vì vậy 2 ban đầu không thay đổi.Thật không may, điều này đòi hỏi người dùng 1 có kiến thức sâu sắc về các biến của nó và chắc chắn dễ bị lỗi. Theo một nghĩa nào đó, chúng tôi đã giải quyết các triệu chứng hơn là nguyên nhân. Chúng tôi thích một cái gì đó là chính xác bằng cách xây dựng.Giải pháp cá nhân của tôi: Nếu bạn chỉ sử dụng một biến lớp để gán giá trị mặc định cho biến thể hiện Python sẽ sử dụng các giá trị có thể thay đổi. Trong trường hợp này, mọi trường hợp của 1 sẽ ghi đè 5 với thuộc tính cá thể riêng của nó, do đó, sử dụng một danh sách trống làm mặc định đã dẫn đến một lỗi nhỏ dễ bị bỏ qua. Thay vì những điều trên, chúng ta cũng có thể làm được:don’t use mutable values. In this case,
every instance of 1 was going to override 5 with its own instance attribute eventually, so using an empty list as the default led to a tiny bug that was easily overlooked. Instead of the above, we could’ve either:
Vậy khi nào bạn nên sử dụng các thuộc tính lớp Python?Các thuộc tính của lớp rất khó khăn, nhưng hãy để Lôi nhìn vào một vài trường hợp khi chúng có ích:
Under-the-hoodLưu ý: Nếu bạn đang lo lắng về hiệu suất ở cấp độ này, bạn có thể không muốn sử dụng Python ngay từ đầu, vì sự khác biệt sẽ theo thứ tự của một phần mười của một mili giây nhưng vẫn vui khi chọc một chút, và giúp minh họa cho lợi ích. If you’re worrying about performance at this level, you might not want to be use Python in the first place, as the differences will be on the order of tenths of a millisecond—but it’s still fun to poke around a bit, and helps for illustration’s sake. Hãy nhớ lại rằng một không gian tên lớp học được tạo ra và điền vào thời điểm định nghĩa lớp học. Điều đó có nghĩa là chúng tôi chỉ thực hiện một bài tập khác với một biến cho một biến nhất định, trong khi các biến thể hiện phải được gán mỗi khi một phiên bản mới được tạo. Hãy để lấy một ví dụ. 2Chúng tôi chỉ định cho 3 chỉ một lần, nhưng 4 trên mỗi cuộc gọi đến 5.Để làm bằng chứng nữa, hãy để sử dụng Python Disassembler: 3Khi chúng ta nhìn vào mã byte, một lần nữa rõ ràng là 6 phải thực hiện hai bài tập, trong khi 7 chỉ làm một.Trong thực tế, điều này đạt được thực sự trông như thế nào? Tôi sẽ là người đầu tiên thừa nhận rằng các bài kiểm tra thời gian phụ thuộc rất nhiều vào các yếu tố thường không thể kiểm soát và sự khác biệt giữa chúng thường khó giải thích chính xác. Tuy nhiên, tôi nghĩ rằng những đoạn trích nhỏ này (chạy với mô -đun thời gian Python) giúp minh họa sự khác biệt giữa các biến lớp và phiên bản, vì vậy tôi đã bao gồm chúng. Lưu ý: Tôi đã trên một MacBook Pro với OS X 10.8.5 và Python 2.7.2. Khởi tạo 4Việc khởi tạo 8 nhanh hơn trong một giây, do đó, sự khác biệt ở đây dường như có ý nghĩa thống kê.Vậy tại sao điều này là trường hợp? Một lời giải thích đầu cơ: Chúng tôi thực hiện hai bài tập trong 6, nhưng chỉ một trong 7.Phân công 5Lưu ý: Không có cách nào để chạy lại mã thiết lập của bạn trên mỗi thử nghiệm với thời gian, vì vậy chúng tôi phải tái cấu trúc biến của chúng tôi trong thử nghiệm của chúng tôi. Dòng thời gian thứ hai đại diện cho thời gian trên với thời gian khởi tạo được tính toán trước đó được khấu trừ. Từ những điều trên, có vẻ như 1 chỉ mất khoảng 60% miễn là 8 để xử lý các bài tập.Tại sao điều này là trường hợp? Một lời giải thích đầu cơ: Khi chúng ta gán cho 3, trước tiên chúng ta nhìn vào không gian tên trường hợp ( 4), không tìm thấy 5, và sau đó nhìn vào không gian tên lớp ( 6), sau đó thực hiện nhiệm vụ thích hợp. Khi chúng tôi gán cho 7, chúng tôi thực hiện một nửa số lần tra cứu, khi chúng tôi gán ngay lập tức cho không gian tên cá thể ( 8).Tóm lại, mặc dù những lợi ích hiệu suất này đã giành được vấn đề trong thực tế, những thử nghiệm này rất thú vị ở cấp độ khái niệm. Nếu bất cứ điều gì, tôi hy vọng những khác biệt này giúp minh họa sự khác biệt cơ học giữa các biến lớp và trường hợp. Tóm lại làCác thuộc tính lớp dường như được sử dụng trong Python; Rất nhiều lập trình viên có những ấn tượng khác nhau về cách họ làm việc và tại sao chúng có thể hữu ích. My Take: Các biến lớp Python có vị trí của họ trong trường của mã tốt. Khi được sử dụng một cách chăm sóc, họ có thể đơn giản hóa mọi thứ và cải thiện khả năng đọc. Nhưng khi bất cẩn ném vào một lớp học nhất định, họ chắc chắn sẽ vấp ngã bạn. Phụ lục: Biến trường hợp riêng tưMột điều tôi muốn bao gồm nhưng didn có một điểm vào tự nhiên Python không có các biến riêng tư để nói, nhưng một mối quan hệ thú vị khác giữa việc đặt tên lớp và thể hiện đi kèm với tên mang tên. Trong hướng dẫn theo phong cách Python, nó đã nói rằng các biến giả-tư nhân nên được đặt trước với một dấu gạch dưới kép: ‘__. Đây không chỉ là một dấu hiệu cho những người khác rằng biến của bạn có nghĩa là được đối xử riêng tư, mà còn là một cách để ngăn chặn quyền truy cập vào nó, các loại. Ở đây, ý tôi là: 6Hãy nhìn vào đó: Thuộc tính thể hiện 9 được tự động có tiền tố với tên lớp để mang lại 0.Mặc dù vẫn có thể giải quyết được và có thể sử dụng 1, tên này là một phương tiện để tạo ra một biến riêng tư vì nó ngăn bạn và những người khác truy cập nó một cách tình cờ hoặc thông qua sự thiếu hiểu biết.Chỉnh sửa: Như Pedro Werneck đã chỉ ra, hành vi này phần lớn nhằm giúp đỡ với các lớp con. Trong hướng dẫn kiểu PEP 8, họ xem nó là phục vụ hai mục đích: (1) ngăn chặn các lớp con truy cập vào một số thuộc tính nhất định và (2) ngăn chặn các cuộc đụng độ không gian tên trong các lớp con này. Mặc dù hữu ích, biến đổi biến đổi không nên được coi là một lời mời viết mã với sự phân biệt công ty tư nhân giả định, chẳng hạn như có trong Java. Một thuộc tính lớp có thể được sử dụng mà không cần ví dụ trong Python không?Mặc dù bạn có thể truy cập các thuộc tính lớp bằng cách sử dụng một thể hiện, nhưng không an toàn khi làm như vậy. Trong Python, trường hợp của một lớp được gọi bằng từ khóa. Sử dụng từ khóa này, bạn có thể truy cập không chỉ tất cả các thuộc tính thể hiện mà cả các thuộc tính lớp.you can access class attributes using an instance it's not safe to do so. In python, the instance of a class is referred to by the keyword self. Using this keyword you can access not only all instance attributes but also the class attributes.
Làm thế nào để bạn truy cập một thuộc tính lớp trong Python?Các thuộc tính của một lớp cũng có thể được truy cập bằng các phương thức và hàm tích hợp sau: getattr ()-hàm này được sử dụng để truy cập thuộc tính của đối tượng.HasAttr () - Hàm này được sử dụng để kiểm tra xem thuộc tính có tồn tại hay không.setAttr () - Hàm này được sử dụng để đặt thuộc tính.getattr() – This function is used to access the attribute of object. hasattr() – This function is used to check if an attribute exist or not. setattr() – This function is used to set an attribute.
Làm thế nào để bạn truy cập thuộc tính riêng tư trong Python?Trong Python, không có sự tồn tại của các phương thức riêng tư không thể truy cập ngoại trừ bên trong một lớp.Tuy nhiên, để xác định tiền tố phương thức riêng tư tên thành viên với Double Undercore, __.Lưu ý: Phương thức __init__ là một hàm tạo và chạy ngay khi một đối tượng của một lớp được khởi tạo.there is no existence of Private methods that cannot be accessed except inside a class. However, to define a private method prefix the member name with the double underscore “__”. Note: The __init__ method is a constructor and runs as soon as an object of a class is instantiated.
Làm thế nào để bạn sửa đổi một thuộc tính lớp trong Python?Nhưng hãy cẩn thận, nếu bạn muốn thay đổi thuộc tính lớp, bạn phải làm điều đó với ký hiệu ClassName.AttributEname.Nếu không, bạn sẽ tạo một biến thể hiện mới.ClassName. AttributeName. Otherwise, you will create a new instance variable. |