Laszlo Zsolt Nagy wrote:
My problem is about properties and the virtuality of the methods. I
would like to create a property whose get and set methods
are virtual.
Perhaps you want to roll your own VirtualProperty descriptor? Here's
one based off the property implementation in Raymond Hettinger's How-To
Guide for Descriptors[1]:
py> class VirtualProperty(object):
.... def __init__(self, getname=None, setname=None, delname=None,
.... doc=None):
.... self.getname = getname
.... self.setname = setname
.... self.delname = delname
.... self.__doc__ = doc
.... def __get__(self, obj, type=None):
.... if obj is None:
.... return self
.... if self.getname is None:
.... raise AttributeError('unreadable attribute')
.... try:
.... fget = getattr(obj, self.getname)
.... except AttributeError:
.... raise TypeError('%s object does not have a %s method' %
.... (type(obj).__name__, self.getname))
.... return fget()
.... def __set__(self, obj, value):
.... if self.setname is None:
.... raise AttributeError("can't set attribute")
.... try:
.... fset = getattr(obj, self.setname)
.... except AttributeError:
.... raise TypeError('%s object does not have a %s method' %
.... (type(obj).__name__, self.setname))
.... fset(value)
.... def __delete__(self, obj):
.... if self.delname is None:
.... raise AttributeError("can't delete attribute")
.... try:
.... fdel = getattr(obj, self.delname)
.... except AttributeError:
.... raise TypeError('%s object does not have a %s method' %
.... (type(obj).__name__, self.delname))
.... fdel()
....
py> class C(object):
.... def getx(self):
.... return 'C'
.... x = VirtualProperty('getx', 'setx', 'delx')
....
py> class D(C):
.... def getx(self):
.... try:
.... return self._x
.... except AttributeError:
.... return 'D'
.... def setx(self, x):
.... self._x = x
....
py> c = C()
py> c.x
'C'
py> c.x = 1
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "<interactive input>", line 24, in __set__
TypeError: C object does not have a setx method
py> del c.x
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "<interactive input>", line 33, in __delete__
TypeError: C object does not have a delx method
py> d = D()
py> d.x
'D'
py> d.x = 1
py> d.x
1
py> del d.x
Traceback (most recent call last):
File "<interactive input>", line 1, in ?
File "<interactive input>", line 33, in __delete__
TypeError: D object does not have a delx method
STeVe
[1]
http://users.rcn.com/python/download/Descriptor.htm