R
rowland
I'm trying to come up with solution for adding synthetic properties to
python, similar to synthetic properties in Objective-C.
I'm playing around with doing this in a MetaClass. I can dynamically
create the attributes that will back the property, but I'm having
trouble figuring out how to dynamically generate get/set methods to
pass to the built-in property() function.
Is it possible to define a lambda or a callable object that will act
as a getter method (or setter, that takes a value argument) during
MetaClass.__init__? The hard part I'm guessing is getting the current
instance passed into the getter. This is my first foray into
MetaClasses and dynamic functions/methods so any pointers are greatly
appreciated.
class ObjectivePythonObject( type ) :
def __new__( cls, name, bases, dct ) :
#print "Allocating memory for class", name
return type.__new__(cls, name, bases, dct )
def __init__( cls, name, bases, dct ) :
#print "Initializing class", name
for propertyInfo in cls.synthesized :
property = propertyInfo[ 0 ]
defaultValue = propertyInfo[ 1 ]
print property
setattr( cls, '_' + property, defaultValue )
# Create property with get/set methods...
class Person( object ) :
__metaclass__ = ObjectivePythonObject
synthesized = [ ( 'name', 'BobC' ),
( 'age', '48' ) ]
def __init__( self ) :
print self._name
print self._age
Thanks,
Rowland
python, similar to synthetic properties in Objective-C.
I'm playing around with doing this in a MetaClass. I can dynamically
create the attributes that will back the property, but I'm having
trouble figuring out how to dynamically generate get/set methods to
pass to the built-in property() function.
Is it possible to define a lambda or a callable object that will act
as a getter method (or setter, that takes a value argument) during
MetaClass.__init__? The hard part I'm guessing is getting the current
instance passed into the getter. This is my first foray into
MetaClasses and dynamic functions/methods so any pointers are greatly
appreciated.
class ObjectivePythonObject( type ) :
def __new__( cls, name, bases, dct ) :
#print "Allocating memory for class", name
return type.__new__(cls, name, bases, dct )
def __init__( cls, name, bases, dct ) :
#print "Initializing class", name
for propertyInfo in cls.synthesized :
property = propertyInfo[ 0 ]
defaultValue = propertyInfo[ 1 ]
print property
setattr( cls, '_' + property, defaultValue )
# Create property with get/set methods...
class Person( object ) :
__metaclass__ = ObjectivePythonObject
synthesized = [ ( 'name', 'BobC' ),
( 'age', '48' ) ]
def __init__( self ) :
print self._name
print self._age
Thanks,
Rowland