переписал метакласс, теперь если ptoperty метод(getter, setter, deleter) в ребенке не определен, берет его от предка.
class PropertyMeta(type):
def __new__(cls, name, bases, dct):
property_dict = dict()
for k,v in dct.items():
if isinstance(v, property):
property_dict[k] = v
for base in bases:
for k, v in base.__dict__.items():
if property_dict.get(k) and isinstance(v, property):
p = property_dict.get(k)
for f_type in ['fget', 'fset', 'fdel']:
if getattr(v, f_type):
dct['_%s_%s' % (f_type[1:], k)] = getattr(v, f_type)
if not getattr(p, f_type):
dct[k] = cls._set_property_func(dct[k], f_type, getattr(v, f_type))
return type.__new__(cls, name, bases, dct)
@classmethod
def _set_property_func(cls, obj, key, func):
# через setattr вылитает ошибка, что обьекты из dct только для чтения
fget = obj.fget
fset = obj.fset
fdel = obj.fdel
if key == 'fget': fget = func
elif key == 'fset': fset = func
else: fdel == func
return property(fget= fget, fset= fset, fdel= fdel)
пример использования
class A(object):
@property
def x(self):
return 1
@x.setter
def x(self, value):
print 'set x = %s' % value
class B(A):
__metaclass__ = PropertyMeta
@property
def x(self):
return self._get_x() * 2
@x.deleter
def x(self):
print 'del x'
>>> b=B()
>>> b.x
2
>>> b.x=10
set x = 10
>>> del b.x
del x
Замечания по коду приветствуються