2012-10-06 42 views
6
def A(): 
    def B(): 
     #do something 

a = A() 
a.B() 

Tại sao mã ở trên không phải là mã đơn giản như vậy? Có cách giải quyết 'pythonic' (dễ đọc, không ngạc nhiên, không hacky) mà không biến A() thành một lớp học không?Tại sao Python không thể truy cập một hàm phụ từ bên ngoài?

Chỉnh sửa 1: Ở trên đã được giải thích với tôi rằng B là cục bộ A, vì vậy nó chỉ tồn tại miễn là A đang được đánh giá. Vì vậy, nếu chúng ta làm cho nó toàn cầu (và chắc chắn không có nó overriden), thì tại sao điều này không làm việc?

def A(): 
    def B(): 
     #do something 
    return A() 

a = A() 
a.B() 

Nó nói nó trả về đối tượng 'NoneType'.

Trả lời

7

Vì định nghĩa hàm chỉ tạo tên trong không gian tên cục bộ. Những gì bạn đang làm không khác gì:

def f(): 
    a = 2 

và sau đó hỏi tại sao bạn không thể truy cập a từ bên ngoài chức năng. Các tên bị ràng buộc bên trong một hàm là cục bộ cho hàm.

Ngoài ra, mã được đề xuất của bạn là lạ. khi bạn làm a = f(), bạn đang đặt giá trị trả lại của hàm. Hàm của bạn trả về không có gì, vì vậy bạn không thể hy vọng truy cập bất cứ thứ gì thông qua giá trị trả về. Có thể trả về hàm bên trong trực tiếp:

def f(): 
    def g(): 
     return "blah" 
    return g 

>>> func = f() 
>>> func() 
'blah' 

Và điều này thực sự hữu ích. Nhưng không có một cách chung để truy cập những thứ bên trong hàm từ bên ngoài ngoại trừ bằng cách sửa đổi các biến toàn cầu (thường là một ý tưởng tồi) hoặc trả về các giá trị. Đó là cách các hàm hoạt động: chúng lấy đầu vào và trả về kết quả đầu ra; họ không làm cho nội tâm của họ có sẵn cho từ bên ngoài.

5

Để gọi B với cú pháp mà bạn muốn, sử dụng:

def A(): 
    def B(): 
     print("I'm B") 
    A.B = B 
    return A 

a = A() 
a.B() 
A.B() 
+0

Đáng tiếc là nó là vô ích, vì để khởi tạo 'A.B' nó là cần thiết để gọi' A() 'ít nhất một lần. :( – prokher

+1

@prokher nó là cần thiết để gọi A để thậm chí tạo ra một chức năng lồng nhau.Và nó sẽ là một chức năng khác nhau mỗi khi bạn gọi A. Đó là lý do duy nhất để có một chức năng lồng nhau ở nơi đầu tiên. –

Các vấn đề liên quan