2011-08-20 29 views
8

Làm thế nào bạn có thể thực hiện một phương thức bằng cách đặt tên của nó, từ một phương thức khác trong cùng một lớp với phương thức được gọi? Như thế này:python variable method name

class Class1: 
    def __init__(self): 
     pass 
    def func1(self, arg1): 
     # some code 
    def func2(self): 
     function = getattr(sys.modules[__name__], "func1") # apparently this does not work 

Bất kỳ đề xuất nào?

Trả lời

9

khoảng getattr(self, "func1")? Ngoài ra, tránh sử dụng tên hàm

Ví dụ:

>>> class C: 
... def f1(self, arg1): print arg1 
... def f2(self): return getattr(self, "f1") 
... 
>>> x=C() 
>>> x.f2()(1) 
1 
+0

Không có lý do gì để sử dụng 'getattr' nếu bạn biết phương pháp bạn muốn - chỉ cần lấy nó. –

5

Bạn sẽ nhận được các thuộc tính từ lớp, không phải là mô-đun.

def func2(self): 
    method = getattr(self, "func1") 
    method("arg") 

Nhưng bạn cũng nên kiểm tra xem nó có thể gọi được không.

if callable(method): 
    method("arg") 

Điều này sẽ tránh gọi điều gì đó mà bạn không mong đợi nhận được. Bạn có thể muốn đưa ra ngoại lệ của riêng bạn ở đây nếu nó không được gọi.

+0

nhờ nó hoạt động – Shaokan

+0

'getattr' là không cần thiết khi bạn biết tên của phương thức. Ngoài ra, tại sao kiểm tra xem nó có thể gọi được không? Hoặc là nó (và nên là nếu nó là một phương pháp), hoặc nó sẽ tăng một ngoại lệ - đó là cách thích hợp để đối phó với một lỗi. –

+2

@Ethan có lẽ tên sẽ thực sự là một biến, và đây chỉ là một ví dụ. Kiểm tra có thể gọi tránh được các lỗi, trong một dòng mã và mục đích rõ ràng hơn, vì getattr có thể trả về bất kỳ loại thuộc tính nào và không chỉ là các phương thức. – Keith

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