2009-11-30 1 views
7

Smalltalkには、オブジェクトがメッセージを理解できないときに呼び出されるメッセージDoesNotUnderstandがあります(オブジェクトに実装されたメッセージが送信されていない場合)。Python - オブジェクトが関数を実装していないときに呼び出される関数が存在しますか?

私は、Pythonに同じことをする関数があるかどうかを知りたいと思います。この例では

:だから

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

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

、私はDoSomethingが呼ばれるようにintentedされたときに、私は知ることができるMyObjectにメソッドを追加することができますか?

PS:貧しい私の英語のために申し訳ありません。

答えて

7

Special method names, Python language referenceを参照してください)。クロージャを使用する場合は、1つのクラスですべてを行うことができます。これと同じように:

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() 

Pythonはクラスで__str__を探していたので、私は__ignored_attributes__について少し追加し、それは少し厄介です。

+0

これは挑戦的に私が望むものです!ありがとう:) –

+0

誰かが確実に反抗しているとき、私はそれが好きです! (またはそれは "挑戦的にはっきりしていますか")何であれ、SOは再びその日を救う! :) – PaulMcG

3

あなたは__getattr__メソッドを探しています。見てくださいhere

クラスの「完全制御」を希望する場合は、__getattribute__特別な方法(here)を見てください。

3

オブジェクトを見ましたか? __getattr__(self, name)、またはオブジェクトです。新しいスタイルのクラスには__getattribute__(self, name)

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 
2

LUCは、2つの別々のクラスを持っていた理由を私は知らない:あなたが何をしたいかについての命題である。ここ

+1

2つのクラスは、より簡単に再利用できるためです。クラスBの同じ振る舞いが必要だと想像してみてください – luc

関連する問題