Hướng dẫn can we define class inside function in python? - chúng ta có thể định nghĩa hàm bên trong lớp trong python không?
Tôi nghĩ rằng tôi đã xử lý khá tốt về các quy tắc phạm vi của Python, nhưng vấn đề này đã bị cản trở hoàn toàn, và Google -Fu của tôi đã làm tôi thất bại (không phải là tôi ngạc nhiên - hãy nhìn vào tiêu đề câu hỏi;) Tôi sẽ bắt đầu với một vài ví dụ hoạt động như mong đợi, nhưng hãy bỏ qua ví dụ 4 cho phần ngon ngọt. Ví dụ 1.
Đủ đơn giản: Trong quá trình định nghĩa lớp học, chúng tôi có thể truy cập các biến được xác định trong phạm vi bên ngoài (trong trường hợp này là toàn cầu). Ví dụ 2.
Một lần nữa (bỏ qua hiện tại tại sao người ta có thể muốn làm điều này), không có gì bất ngờ ở đây: chúng ta có thể truy cập các chức năng trong phạm vi bên ngoài. Lưu ý: Như Frédéric đã chỉ ra bên dưới, chức năng này dường như không hoạt động. Xem ví dụ 5 (và hơn thế nữa) thay thế.: as Frédéric pointed out below, this function doesn't seem to work. See Example 5 (and beyond) instead. Ví dụ 3.
Điều này về cơ bản giống như ví dụ 1: Chúng tôi đang truy cập phạm vi bên ngoài từ trong định nghĩa lớp, chỉ là thời điểm này phạm vi không toàn cầu, nhờ 3.EDIT 5: Như @user3022222 đã chỉ ra bên dưới, tôi đã làm hỏng ví dụ này trong bài đăng gốc của mình. Tôi tin rằng điều này không thành công vì chỉ các chức năng (không phải các khối mã khác, như định nghĩa lớp này) có thể truy cập các biến trong phạm vi kèm theo. Đối với các khối mã không chức năng, chỉ có thể truy cập các biến cục bộ, toàn cầu và tích hợp. Một lời giải thích kỹ lưỡng hơn có sẵn trong câu hỏi này As @user3022222 pointed out below, I botched this example in my original posting. I believe this fails because only functions (not other code blocks, like this class definition) can access variables in the enclosing scope. For non-function code blocks, only local, global and built-in variables are accessible. A more thorough explanation is available in this question Một lần nữa: Ví dụ 4.
Ừm ... xin lỗi? Điều gì làm cho điều này khác với ví dụ 2? Tôi hoàn toàn bị cản trở. Xin hãy sắp xếp cho tôi. Cảm ơn! P.S. Về cơ hội rằng đây không chỉ là vấn đề với sự hiểu biết của tôi, tôi đã thử điều này trên Python 2.5.2 và Python 2.6.2. Thật không may, đó là tất cả những gì tôi có quyền truy cập vào lúc này, nhưng cả hai đều thể hiện cùng một hành vi. Chỉnh sửa theo http://docs.python.org/tutorial/classes.html#python-scopes-and-macespaces: Bất cứ lúc nào trong quá trình thực hiện, có ít nhất ba phạm vi lồng nhau có không gian tên có thể truy cập trực tiếp: According to http://docs.python.org/tutorial/classes.html#python-scopes-and-namespaces: at any time during execution, there are at least three nested scopes whose namespaces are directly accessible:
#4. dường như là một ví dụ phản đối thứ hai trong số này. Chỉnh sửa 2 Ví dụ 5.
Chỉnh sửa 3 Như @frédéric đã chỉ ra việc gán cho một biến có cùng tên với phạm vi bên ngoài dường như "che dấu" biến bên ngoài, ngăn chặn việc gán hoạt động. Vì vậy, phiên bản sửa đổi của ví dụ 4 hoạt động:
Tuy nhiên điều này không:
Tôi vẫn chưa hoàn toàn hiểu tại sao mặt nạ này xảy ra: không phải ràng buộc tên xảy ra khi bài tập xảy ra? Ví dụ này ít nhất cung cấp một số gợi ý (và một thông báo lỗi hữu ích hơn):
Vì vậy, có vẻ như biến cục bộ được xác định trong việc tạo chức năng (thành công), dẫn đến tên cục bộ là "bảo lưu" và do đó che dấu tên phạm vi bên ngoài khi hàm được gọi. Interesting. Cảm ơn Frédéric vì câu trả lời! Để tham khảo, từ các tài liệu Python:
Chỉnh sửa 4 Câu trả lời thực sựHành vi dường như khó hiểu này là do phạm vi lồng nhau của Python được định nghĩa trong PEP 227. Nó thực sự không liên quan gì đến PEP 3104. Từ PEP 227:
Cho phép chạy hai phiên bản đơn giản hơn trong ví dụ của Tim:
Khi 4 không tìm thấy 5 trong phạm vi bên trong của nó, nó sẽ tự động tìm kiếm bên ngoài, tìm ra 5 trong phạm vi của ________ 17, đã bị ràng buộc với 8 thông qua nhiệm vụ 9.Nhưng thay đổi thứ tự hai câu cuối cùng trong 7 gây ra lỗi: 0Hãy nhớ rằng PEP 227 cho biết "các quy tắc độ phân giải tên là điển hình cho các ngôn ngữ có phạm vi thống kê", hãy xem xét phiên bản C tương đương (bán) phiên bản C tương đương: 1biên dịch và chạy: 2Vì vậy, trong khi C sẽ vui vẻ sử dụng một biến không liên kết (sử dụng bất cứ điều gì xảy ra đã được lưu trữ ở đó trước: 134520820, trong trường hợp này), Python (rất may) từ chối. Là một câu chuyện phụ thú vị, phạm vi lồng nhau được cho phép mà Alex Martelli đã gọi là "Tối ưu hóa quan trọng nhất mà trình biên dịch Python thực hiện: các biến cục bộ của một hàm không được giữ trong một vectơ chặt chẽ Truy cập biến cục bộ sử dụng chỉ mục trong vectơ đó, không phải là tra cứu tên. " Tôi có thể xác định một lớp trong một chức năng python không?Chúng ta phải nói rõ ràng với Python rằng đó là một phương thức lớp bằng cách sử dụng hàm trang trí @ClassMethod hoặc classMethod (). Các phương thức lớp được xác định bên trong một lớp và nó khá giống với việc xác định một hàm chính quy. Giống như, bên trong một phương thức thể hiện, chúng tôi sử dụng từ khóa tự truy cập hoặc sửa đổi các biến thể hiện.Class methods are defined inside a class, and it is pretty similar to defining a regular function. Like, inside an instance method, we use the self keyword to access or modify the instance variables.
Chúng ta có thể xác định lớp bên trong chức năng không?Một lớp được khai báo bên trong một hàm trở thành cục bộ cho hàm đó và được gọi là lớp cục bộ trong C ++.Một tên lớp địa phương chỉ có thể được sử dụng tại địa phương, tức là bên trong hàm chứ không phải bên ngoài nó.Các phương pháp của một lớp địa phương chỉ được xác định bên trong nó.Một lớp địa phương có thể có chức năng tĩnh, nhưng không phải là thành viên dữ liệu tĩnh.. A local class name can only be used locally i.e., inside the function and not outside it. The methods of a local class must be defined inside it only. A local class can have static functions but, not static data members.
Chúng ta có thể xác định một lớp bên trong một lớp học trong Python không?Một lớp được xác định trong một lớp khác được gọi là lớp bên trong hoặc lớp lồng nhau.Nếu một đối tượng được tạo bằng cách sử dụng lớp bên trong lớp con thì đối tượng cũng có thể được sử dụng bởi lớp cha hoặc lớp gốc.Một lớp cha có thể có một hoặc nhiều lớp bên trong nhưng nhìn chung các lớp bên trong được tránh.. If an object is created using child class means inner class then the object can also be used by parent class or root class. A parent class can have one or more inner classes but generally inner classes are avoided. |