Respond to an unknown method call: Difference between revisions
(add some omits...) |
(added python) |
||
Line 3: | Line 3: | ||
This task is intended only for object systems that use a dynamic dispatch mechanism. |
This task is intended only for object systems that use a dynamic dispatch mechanism. |
||
=={{header|Python}}== |
|||
Python objects can implement a <code>__getattr__()</code> method to handle accesses of unknown attributes (methods are just attributes that are callable; so this function handles both methods and non-method fields). Here we assume that if you access an unknown attribute, you want a method, so we return a function that can be called. |
|||
<lang python>class Example: |
|||
def foo(self): |
|||
print "this is foo" |
|||
def bar(self): |
|||
print "this is bar" |
|||
def __getattr__(self, name): |
|||
def method(*args): |
|||
print "tried to handle unknown method " + name |
|||
if args: |
|||
print "it had arguments: " + str(args) |
|||
return method |
|||
example = Example() |
|||
example.foo() # prints “this is foo” |
|||
example.bar() # prints “this is bar” |
|||
example.grill() # prints “tried to handle unknown method grill” |
|||
example.ding("dong") # prints “tried to handle unknown method ding” |
|||
# prints “it had arguments: ('dong',)”</lang> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |
Revision as of 23:30, 3 June 2009
You are encouraged to solve this task according to the task description, using any language you may know.
Demonstrate how to make the object respond (sensibly/usefully) to an invocation of a method on it that it does not support through its class definitions. Note that this is not the same as just invoking a defined method whose name is given dynamically; the method named at the point of invocation must not be defined.
This task is intended only for object systems that use a dynamic dispatch mechanism.
Python
Python objects can implement a __getattr__()
method to handle accesses of unknown attributes (methods are just attributes that are callable; so this function handles both methods and non-method fields). Here we assume that if you access an unknown attribute, you want a method, so we return a function that can be called.
<lang python>class Example:
def foo(self): print "this is foo" def bar(self): print "this is bar" def __getattr__(self, name): def method(*args): print "tried to handle unknown method " + name if args: print "it had arguments: " + str(args) return method
example = Example()
example.foo() # prints “this is foo” example.bar() # prints “this is bar” example.grill() # prints “tried to handle unknown method grill” example.ding("dong") # prints “tried to handle unknown method ding”
# prints “it had arguments: ('dong',)”</lang>
Tcl
<lang tcl># First create a simple, conventional class and object oo::class create Example {
method foo {} { puts "this is foo" } method bar {} { puts "this is bar" }
} Example create example
- Modify the object to have a custom ‘unknown method’ interceptor
oo::objdefine example {
method unknown {name args} { puts "tried to handle unknown method \"$name\"" if {[llength $args]} { puts "it had arguments: $args" } }
}
- Show off what we can now do...
example foo; # prints “this is foo” example bar; # prints “this is bar” example grill; # prints “tried to handle unknown method "grill"” example ding dong; # prints “tried to handle unknown method "ding"”
# prints “it had arguments: dong”</lang>