2017-08-30 64 views
5

Trong Java tôi có thể gọi một lớp hoặc phương pháp mà không cần nhập khẩu nó bằng cách tham khảo tên đầy đủ của nó:Làm thế nào để gọi một phương thức Python sử dụng tên đầy đủ của nó?

public class Example { 
    void example() { 

     //Use BigDecimal without importing it 
     new java.math.BigDecimal(1); 
    } 
} 

tương tự cú pháp rõ ràng sẽ không làm việc sử dụng Python:

class Example: 
    def example(self): 

     # Fails 
     print(os.getcwd()) 

Thói quen tốt và PEP khuyến nghị sang một bên, tôi có thể làm điều tương tự trong Python không?

+1

Không, bạn không thể gọi một lớp hoặc phương pháp mà không cần nhập nó - Tại sao bạn muốn tránh nhập? Bạn có thể nhập nó cục bộ trong chức năng của bạn mà chỉ cần thay đổi java 1-lót của bạn thành một lớp lót 2 trong python. Đó có phải là điều duy nhất bạn đang cố tránh? – mgilson

+0

Tôi ưa thích một lớp lót vì tôi đang chơi xung quanh với một số mã tiêm dựa trên AST và tôi muốn sửa đổi mô-đun ban đầu càng ít càng tốt – noamt

Trả lời

2

Chức năng không tồn tại cho đến khi định nghĩa của nó chạy, có nghĩa là mô-đun đang chạy, nghĩa là mô-đun được nhập (trừ khi đó là tập lệnh bạn chạy trực tiếp).

Điều gần nhất tôi có thể nghĩ là print(__import__('os').getcwd()).

+0

Dường như '__import() __' sẽ hoạt động hoàn hảo trong trường hợp này – noamt

+1

@noamt Thực ra, bạn thực sự không nên sử dụng '__import__'. Nếu bạn muốn một cái gì đó như nó, sử dụng 'importlib.import_module'. –

+0

'__import__' hoặc' importlib' có xử lý các đường dẫn đủ điều kiện có tên lớp trong đó không? ví dụ. 'module.OuterClass.InnerClass.some_classmethod'? – mgilson

1

Tôi không chắc chắn rằng bạn có thể làm giống hệt nhau, nhưng bạn chỉ có thể nhập các chức năng:

from foo.bar import baz as baz_fn 

baz_fn() 

nơi foo.bar là tên đầy đủ của các mô-đun có chứa các chức năng và baz là tên của hàm bạn muốn nhập. Nó sẽ nhập nó như tên baz_fn.

2

Không. Nếu bạn muốn sử dụng mô đun bằng Python, bạn phải nhập tên của nó vào phạm vi. Và, như @AlexHall đã đề cập, lớp/chức năng/mô-đun không tồn tại cho đến thời gian nhập. Không có cách nào để truy cập nó mà không cần import -ing. Theo tôi, tuy nhiên, điều này làm cho mã tốt hơn và rõ ràng hơn. Điều này buộc bạn phải rõ ràng khi nhập tên mô-đun.

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