Newsgroups: comp.lang.python
ram@zedat.fu-berlin.de (Stefan Ram) writes:
from types import *
What do you mean, the cloning part is missing?
import types
# create a new object
def counter_object(): pass
# attach a numeric field to the object
counter_object.counter_value = 0
# define a named function
def increment_value( self ): self.counter_value += 1
# attach the named function to the object as a method
counter_object.increment_value = \
types.MethodType( increment_value, counter_object )
# call the method
counter_object.increment_value()
# attach an unnamed function to the object
counter_object.get_value = \
types.MethodType( lambda self: self.counter_value, counter_object )
# call that method
# Prints "1".
print( counter_object.get_value() )
# An ad-hoc function to clone an object for the purpose of "prototype
# inheritance". Might need to be refined for more general uses.
def clone_object( object_ ):
def new_object(): pass
for attribute in dir( object_ ):
if attribute[ :2 ]!= '__':
if type( getattr( object_, attribute ))== types.MethodType:
method = getattr( object_, attribute )
function = types.FunctionType( method.__code__, {} )
method = types.MethodType( function, new_object )
setattr( new_object, attribute, method )
else:
field = getattr( object_, attribute )
setattr( new_object, attribute, field )
return new_object
# create two "clones" ("clone objects")
clone = clone_object( counter_object )
other = clone_object( counter_object )
# The clones "inherited" the counter field including its value.
# Prints "1 1 1".
print( counter_object.get_value(), clone.get_value(), other.get_value() )
# Each object's counter has a value independent from the other object's
# counter.
other.increment_value()
# Prints "1 1 2"
print( counter_object.get_value(), clone.get_value(), other.get_value() )