2009-11-30 35 views
7

Trong Smalltalk có một thông báo DoesNotUnderstand được gọi khi một đối tượng không hiểu một thông báo (đây là, khi đối tượng không có thông điệp được gửi được triển khai).Python - Tồn tại một hàm được gọi khi một đối tượng không thực hiện một hàm?

Vì vậy, tôi muốn biết nếu trong python có một chức năng làm điều tương tự.

Trong ví dụ này:

class MyObject: 
    def __init__(self): 
     print "MyObject created" 

anObject = MyObject() # prints: MyObject created 
anObject.DoSomething() # raise an Exception 

Vì vậy, tôi có thể thêm một phương pháp để MyObject để tôi có thể biết khi nào DoSomething là intented để được gọi là?

PS: Xin lỗi vì tiếng Anh kém của tôi.

Trả lời

7

Dưới đây là một đề xuất cho những gì bạn muốn làm:

class callee: 
    def __init__(self, name): 
     self.name = name 

    def __call__(self): 
     print self.name, "has been called" 


class A: 
    def __getattr__(self, attr): 
     return callee(attr) 

a = A() 

a.DoSomething() 
>>> DoSomething has been called 
+0

Đây chắc chắn là điều tôi muốn! Cảm ơn :) –

+0

Tôi thích khi ai đó chắc chắn thách thức! (hoặc là "defiantly definite"?) Dù sao, SO tiết kiệm trong ngày một lần nữa! :) – PaulMcG

3

Bạn đang tìm phương pháp __getattr__. Có một cái nhìn here.

Nếu bạn muốn "toàn quyền kiểm soát" của một lớp học, hãy xem phương pháp đặc biệt __getattribute__ sau đó (here).

2

Tôi không biết tại sao luc có hai lớp riêng biệt. Bạn có thể làm tất cả với một lớp, nếu bạn sử dụng một đóng cửa. Cũng giống như vậy:

class A(object): 
    __ignored_attributes__ = set(["__str__"]) 

    def __getattr__(self, name): 
     if __name__ in self.__ignored_attributes__: 
      return None 

     def fn(): 
      print name, "has been called with self =", self 

     return fn 

a = A() 
a.DoSomething() 

tôi thêm chút thông tin về __ignored_attributes__ vì Python được nhìn lên __str__ trong lớp và có một chút lộn xộn.

+1

hai lớp vì nó có thể được tái sử dụng dễ dàng hơn. Hãy tưởng tượng bạn muốn hành vi tương tự cho lớp B – luc

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