尽管值不确定,但如果可以将第一个__slots__放入子类中,以下技巧将起作用。在class A( object ):
__slots__ = ( 'a', )
class B( A ):
__slots__ = ()
@property
def a( self ):
try:
return A.a.__get__( self )
except AttributeError:
return 'no a set'
@a.setter
def a( self, val ):
A.a.__set__( self, val )
(您可以使用自己的描述符而不是属性。)对于以下定义:
^{pr2}$
据我所知,__slots__是用它自己的描述符实现的,因此在同一个类中__slots__后面的另一个描述符将被覆盖。如果您想详细说明这项技术,可以在self.__class__.__mro__中搜索候选描述符(或者在您自己的__get__中从instance开始)。在
附言
好吧。。。如果你真的想使用一个类,你可以使用以下改编:class C( object ):
__slots__ = ( 'c', )
class MyDescriptor( object ):
def __init__( self, slots_descriptor ):
self.slots_descriptor = slots_descriptor
def __get__( self, inst, owner = None ):
try:
return self.slots_descriptor.__get__( inst, owner )
except AttributeError:
return 'no c'
def __set__( self, inst, val ):
self.slots_descriptor.__set__( inst, val )
C.c = MyDescriptor( C.c )
如果您坚持不可测性,您可以在元类或类装饰器中进行赋值。在