2010-09-03 29 views
7

Trong PHP, tôi có thể làm một cái gì đó như thế này:Python tương đương với PHP __call() phương pháp ma thuật?

class MyClass 
{ 
    function __call($name, $args) 
    { 
    print('you tried to call a the method named: ' . $name); 
    } 
} 
$Obj = new MyClass(); 
$Obj->nonexistant_method(); // prints "you tried to call a method named: nonexistant_method" 

Đây sẽ là thuận tiện để có thể làm bằng Python cho một dự án tôi đang làm việc trên (nhiều XML khó chịu để phân tích, nó muốn được tốt đẹp để biến nó thành đối tượng và có thể chỉ cần gọi phương pháp này.

Liệu Python có một tương đương?

Trả lời

12

Xác định phương thức __getattr__ trên đối tượng của bạn và trả về một hàm (hoặc một đóng) từ nó.

In [1]: class A: 
    ...:  def __getattr__(self, name): 
    ...:   def function(): 
    ...:    print("You tried to call a method named: %s" % name) 
    ...:   return function 
    ...:  
    ...:  

In [2]: a = A() 

In [3]: a.test() 
You tried to call a method named: test 
+0

Khá tốt, mặc dù cũng có thể hữu ích khi xác định hàm lồng nhau là 'hàm (* args)' để thân thể có thể sử dụng cả tên hàm và đối số bất kỳ được truyền. Phụ thuộc vào những gì Keith muốn các phương pháp để làm. (Tất nhiên nếu không có bất kỳ đối số nào cho bất kỳ phương thức nào, '__getattr__' có thể trả lại kết quả, do đó mô phỏng các trường thay vì các phương thức.) –

+0

Tôi thực sự muốn có được các đối số hàm như tốt. Là sự thay đổi cần thiết duy nhất để định nghĩa hàm def(): là hàm def (* args) :? Hay tôi cũng cần phải làm gì khác? (Python newbie, xin lỗi!) –

+0

@Keith: Nếu hàm nhận các đối số tùy ý, sau đó đặt '* args' vào danh sách đối số và nó sẽ nhận được một bộ tuple với tất cả các đối số. Nếu nó là một số lượng các đối số cố định, thì bạn có thể tiếp tục và định nghĩa 'hàm (a, b)' trực tiếp, ví dụ, để lấy hai đối số. – Juliano

1

Bạn có thể muốn __getattr__, mặc dù nó hoạt động trên lớp thuộc tính cũng như phương pháp (vì phương pháp này chỉ thuộc tính đó là các hàm)

0

tôi đang tìm kiếm giống nhau nhưng kể từ khi gọi phương pháp là một hoạt động hai bước như: * 1. thu thập các thuộc tính (. Obj _ getattr _) * 2. gọi đó là (obtainObject. _ gọi _)

Không có phương pháp kỳ diệu nào dự đoán cả hai hành động.

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