#!/usr/bin/env python
import types
def method_property( name) :
def getter( self ) :
return getattr ( self , name)
def setter( self , value) :
setattr ( self , name, types .MethodType ( value, self ) )
return getter, setter
class Duck( object ) :
def __init__ ( self , fly, quack) :
self .fly = fly
self .quack = quack
quack = property ( *method_property( "_quack" ) )
fly = property ( *method_property( "_fly" ) )
def swim( self ) :
print "All ducks float, even decoys!"
class MallardDuck( Duck) :
def __init__ ( self ) :
Duck.__init__ ( self , fly, quack)
print "I'm a real Mallard Duck"
class ModelDuck( Duck) :
def __init__ ( self ) :
Duck.__init__ ( self , fly_no_way, squeak_quack)
print "I'm a Model Duck"
class DecoyDuck( Duck) :
def __init__ ( self ) :
Duck.__init__ ( self , fly_no_way, mute_quack)
print "I'm a Decoy Duck"
def fly( self ) :
print "I'm flying!!"
def fly_no_way( self ) :
print "I can't fly"
def fly_rocket_powered( self ) :
print "I'm flying with a rocket!"
def quack( self ) :
print "Quack"
def mute_quack( self ) :
print "<< Silence >>"
def squeak_quack( self ) :
print "Squeak"
if __name__ == "__main__" :
print '#' *80
print "Mallard Duck"
print '#' *80
mallard = MallardDuck( )
mallard.quack ( )
mallard.fly ( )
print '#' *80
print "Model Duck"
print '#' *80
model = ModelDuck( )
model.fly ( )
model.fly = fly_rocket_powered
model.fly ( )
print '#' *80
print "Decoy Duck"
print '#' *80
decoy = DecoyDuck( )
decoy.fly ( )
decoy.quack ( )
IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCgppbXBvcnQgdHlwZXMKCmRlZiBtZXRob2RfcHJvcGVydHkobmFtZSk6CiAgICBkZWYgZ2V0dGVyKHNlbGYpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpCiAgICBkZWYgc2V0dGVyKHNlbGYsIHZhbHVlKToKICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIHR5cGVzLk1ldGhvZFR5cGUodmFsdWUsIHNlbGYpKQogICAgcmV0dXJuIGdldHRlciwgc2V0dGVyCgpjbGFzcyBEdWNrKG9iamVjdCk6CiAgICBkZWYgX19pbml0X18oc2VsZiwgZmx5LCBxdWFjayk6CiAgICAgICAgc2VsZi5mbHkgPSBmbHkKICAgICAgICBzZWxmLnF1YWNrID0gcXVhY2sKCiAgICBxdWFjayA9IHByb3BlcnR5KCptZXRob2RfcHJvcGVydHkoIl9xdWFjayIpKQogICAgZmx5ID0gcHJvcGVydHkoKm1ldGhvZF9wcm9wZXJ0eSgiX2ZseSIpKQoKICAgIGRlZiBzd2ltKHNlbGYpOgogICAgICAgIHByaW50ICJBbGwgZHVja3MgZmxvYXQsIGV2ZW4gZGVjb3lzISIKCmNsYXNzIE1hbGxhcmREdWNrKER1Y2spOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIER1Y2suX19pbml0X18oc2VsZiwgZmx5LCBxdWFjaykKICAgICAgICBwcmludCAiSSdtIGEgcmVhbCBNYWxsYXJkIER1Y2siCgpjbGFzcyBNb2RlbER1Y2soRHVjayk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgRHVjay5fX2luaXRfXyhzZWxmLCBmbHlfbm9fd2F5LCBzcXVlYWtfcXVhY2spCiAgICAgICAgcHJpbnQgIkknbSBhIE1vZGVsIER1Y2siCgpjbGFzcyBEZWNveUR1Y2soRHVjayk6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgRHVjay5fX2luaXRfXyhzZWxmLCBmbHlfbm9fd2F5LCBtdXRlX3F1YWNrKQogICAgICAgIHByaW50ICJJJ20gYSBEZWNveSBEdWNrIgoKZGVmIGZseShzZWxmKToKICAgIHByaW50ICJJJ20gZmx5aW5nISEiCgpkZWYgZmx5X25vX3dheShzZWxmKToKICAgIHByaW50ICJJIGNhbid0IGZseSIKCmRlZiBmbHlfcm9ja2V0X3Bvd2VyZWQoc2VsZik6CiAgICBwcmludCAiSSdtIGZseWluZyB3aXRoIGEgcm9ja2V0ISIKCmRlZiBxdWFjayhzZWxmKToKICAgIHByaW50ICJRdWFjayIKCmRlZiBtdXRlX3F1YWNrKHNlbGYpOgogICAgcHJpbnQgIjw8IFNpbGVuY2UgPj4iCgpkZWYgc3F1ZWFrX3F1YWNrKHNlbGYpOgogICAgcHJpbnQgIlNxdWVhayIKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CgogICAgcHJpbnQgJyMnKjgwCiAgICBwcmludCAiTWFsbGFyZCBEdWNrIgogICAgcHJpbnQgJyMnKjgwCiAgICBtYWxsYXJkID0gTWFsbGFyZER1Y2soKQogICAgbWFsbGFyZC5xdWFjaygpCiAgICBtYWxsYXJkLmZseSgpCgogICAgcHJpbnQgJyMnKjgwCiAgICBwcmludCAiTW9kZWwgRHVjayIKICAgIHByaW50ICcjJyo4MAogICAgbW9kZWwgPSBNb2RlbER1Y2soKQogICAgbW9kZWwuZmx5KCkKICAgIG1vZGVsLmZseSA9IGZseV9yb2NrZXRfcG93ZXJlZAogICAgbW9kZWwuZmx5KCkKCiAgICBwcmludCAnIycqODAKICAgIHByaW50ICJEZWNveSBEdWNrIgogICAgcHJpbnQgJyMnKjgwCiAgICBkZWNveSA9IERlY295RHVjaygpCiAgICBkZWNveS5mbHkoKQogICAgZGVjb3kucXVhY2soKQ==