[EMAIL PROTECTED] a écrit :
I'm trying to come up with solution for adding synthetic properties to
python, similar to synthetic properties in Objective-C.

Please explain what Objective-C "synthetic properties" are - not everyone here has a strong Objective-C background...

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.

FWIW, the property type is just one possible application of the descriptor protocol. You can easily define your own custom descriptor classes - and you can even do this dynamically.

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__?

Yes.

 The hard part I'm guessing is getting the current
instance passed into the getter.

Not really.

 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 )

This is what type.__new__ do, so you just don't need it.

    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


<side-note>
May I suggest you read about Python's coding conventions ? Your code formatting is utterly unpythonic...
</side-note>

Ok, here's a working (and slightly more pythonic - at least wrt/ coding style) version of your code:

def _make_prop(attrname, default):
    def fget(self):
        return getattr(self, attrname, default)
    def fset(self, value):
        setattr(self, attrname, value)
    return property(fget=fget, fset=fset)

class ObjectivePythonType(type) :
    def __init__(cls, name, bases, dct):
        # we don't want to redefine properties already
        # defined in a base class
        synthesized = dct.get('synthesized', ())
        for propname, default in synthesized:
            attrname = "_%s" % propname
            setattr(cls, propname, _make_prop(attrname, default))


class ObjectivePythonObject(object):
    __metaclass__ = ObjectivePythonType

class Person(ObjectivePythonObject):
    synthesized = [
        ('name', 'BobC'),
        ('age', '48'),
        ]

    def __init__(self) :
        print self.name
        print self.age


Now... While all this is certainly usefull as a learning exercice on metaclasses etc, it's also an awfully overcomplexificated way to do something quite simple. Here's some code that do exactly the same thing:

class PythonPerson(object):
    name = "BobC"
    age = "48"

    def __init__(self):
        print self.name
        print self.age


HTH

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to