2009-11-30 4 views
7

In Smalltalk gibt es eine Nachricht DoesNotUnderstand, die aufgerufen wird, wenn ein Objekt eine Nachricht nicht versteht (dh, wenn das Objekt die Nachricht nicht gesendet implementiert hat).Python - Existiert eine Funktion, die aufgerufen wird, wenn ein Objekt keine Funktion implementiert?

Also, ich möchte wissen, ob in Python eine Funktion, die das gleiche tut.

In diesem Beispiel:

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

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

Also, ich kann hinzufügen, ein Verfahren zu MyObject so kann ich wissen, wann DoSomething genannt werden soll, intented?

PS: Sorry für mein schlechtes Englisch.

Antwort

7

Hier ist ein Vorschlag für das, was Sie tun möchten:

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

Das ist trotzig was ich will! Danke :) –

+0

Ich mag es, wenn jemand definitiv trotzig ist! (oder ist das "trotzig definitiv"?) Was auch immer, SO rettet den Tag wieder! :) – PaulMcG

3

Sie suchen nach der __getattr__ Methode. Schauen Sie sich here an.

Wenn Sie "totale Kontrolle" einer Klasse wollen, schauen Sie sich die spezielle Methode __getattribute__ dann an (here).

2

Ich weiß nicht, warum luc die beiden getrennten Klassen hatte. Sie können alles mit einer Klasse machen, wenn Sie eine Schließung verwenden. Wie so:

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

habe ich die etwas über __ignored_attributes__ weil Python wurde __str__ in der Klasse sucht und dass bekam ein wenig chaotisch.

+1

zwei Klassen, weil es einfacher wiederverwendet werden kann. Stellen Sie sich vor, Sie möchten dasselbe Verhalten für Klasse B haben – luc

Verwandte Themen