Oooh, nice Python code. I'm really interested in how these techniques develop in the Python community.
There's a third trick you can do with Ruby's metaclasses, but it depends on a block-form lambda.
The following example is inspired by UnrealScript, which is a Java-like game programming language. UnrealScript objects can be in different states, and each state can selectively override methods:
class Monster < Actor on :make_noise do "Growl!" end # "default_" should be a decorator. default_state :awake do on :drink_warm_milk do |glasses| self.state = :asleep if glasses >= 1 end end state :asleep do on :make_noise do "Snore!" end end end monster = Monster.new monster.make_noise # -> "Growl!" monster.drink_warm_milk 2 monster.make_noise # -> "Snore!"
There's more syntactic clutter here than I'd like, but the code works. The biggest limitation is that Ruby doesn't support default values for block parameters.
Is there an obvious way to approximate this in Python? I suspect there might be something with decorators that would get pretty close.