class NamedDescriptor(object):
def __init__(self):
# Name of the attribute, will be set by the classes with
# the meta class DescriptorNameGetterMetaClass
self.name = None
def __get__(self, obj, type=None):
if obj:
# at the moment, we return the name of the descriptor,
# you can change this line to adapt to your needs
return self.name
else:
return self
def __set__(self, adaptor, value):
if adaptor:
# change the name, you can change this line to adapt to your needs
self.name = value
else:
raise AttributeError('Cannot set this value')
class NamedDescriptorResolverMetaClass(type):
def __new__(cls, classname, bases, classDict):
for name, attr in classDict.iteritems():
if isinstance(attr, NamedDescriptor):
attr.name = name
return type.__new__(cls, classname, bases, classDict)
class DescriptorHost(object):
'''
The Descriptor gets its name automatically even before any instance of the class is created,
thanks MetaClass!
>>> DescriptorHost.myFunDescriptor.name
'myFunDescriptor'
In our case, the NamedDescriptor returns it's name when being looked for from the host instance:
>>> dh = DescriptorHost()
>>> dh.myFunDescriptor
'myFunDescriptor'
'''
__metaclass__ = NamedDescriptorResolverMetaClass
myFunDescriptor = NamedDescriptor()
if __name__ == "__main__":
import doctest
doctest.testmod()
Diff to Previous Revision
--- revision 1 2010-10-19 22:20:22
+++ revision 2 2010-10-19 22:25:50
@@ -1,11 +1,13 @@
class NamedDescriptor(object):
def __init__(self):
- # Name of the attribute, will be set by the instances of the meta class DescriptorNameGetterMetaClass
+ # Name of the attribute, will be set by the classes with
+ # the meta class DescriptorNameGetterMetaClass
self.name = None
def __get__(self, obj, type=None):
if obj:
- # at the moment, we return the name of the descriptor, you can change this line to adapt to your needs
+ # at the moment, we return the name of the descriptor,
+ # you can change this line to adapt to your needs
return self.name
else:
return self
@@ -28,7 +30,8 @@
class DescriptorHost(object):
'''
- The Descriptor gets its name automatically even before any instance of the class is created, thanks MetaClass!
+ The Descriptor gets its name automatically even before any instance of the class is created,
+ thanks MetaClass!
>>> DescriptorHost.myFunDescriptor.name
'myFunDescriptor'