Вы можете переопределить стандартную характеристику «только для чтения» атрибута property
__get__
, используя простое наследование:
class MyProperty( property ): pass
class Test( object ):
def __init__( self ):
self._x = 10
def get_x( self ):
return self._x
@MyProperty
def x( self ):
return self.get_x()
test = Test()
Проблема теперь в том, что даже если вы переопределите __get__
атрибут вашегоСвойство Text.x, для test.x
запроса Python во время выполнения вызовет MyProperty.__get__(Test.x, test, Test)
Так что вы можете переписать его только там, как
MyProperty.__get__ = lambda self,instance,owner: ""the x attribute"
Так что хороший вариант здесь - делегировать вызов некоторымredifineable атрибут, такой как
MyProperty.__get__ = lambda self,instance,owner: self.get(instance,owner)
Отныне получите атрибут вашей собственности под вашим полным контролем.Также есть плохая опция для генерации отдельного типа для каждого объекта, похожего на свойство.Так что в хорошем случае вы можете сделать что-то вроде:
class MyProperty( property ):
def __get__(self,instance,owner) :
if not instance: return self
else: return self.get(instance,owner)
class Test( object ):
def __init__( self ):
self._x = 10
def get_x( self ):
return self._x
@MyProperty
def x( self ): pass
@MyProperty
def y(self): pass
x.get = lambda self,clazz: self.get_x()
y.get = lambda self,clazz: "the y property of " + clazz.__name__ + " object"
>>> test = Test()
>>> test.x
10
>>> test.y
'the y property of Test object'