Почему нельзя использовать слоты вместе с декораторами для обеспечения инкапсуляции в Python?
Я читал, что в Python нет строгого соблюдения Encapsulation. Слоты обычно используются для более быстрого доступа к атрибутам и экономии памяти, как показано здесь. Однако инкапсуляция может быть строго соблюдена с использованием слотов и декораторов, как показано в следующем коде:
class GetSet(object):
__slots__ = ["attrval"]
def __init__(self,value):
self.attrval = value
@property
def var(self):
#print 'getting the "var" attribute'
return self.attrval
@var.setter
def var(self,value):
#print 'setting the "var" attribute'
self.attrval = value
@var.deleter
def var(self):
#print 'deleting the "var" attribute'
self.attrval = None
Экземпляр GetSet не будет иметь установки динамических переменных (из-за слотов), а также методы setter и getter будут вызывать определения методов в классе. Разве инкапсуляция не вызывается полностью?
1 ответ
Я читал, что в Python нет строгого соблюдения Encapsulation.
Потому что атрибуты общедоступны всегда. И они могут быть достигнуты независимо от того, что вы делаете, даже если вы используете __
префикс члена:
class GetSet(object):
__slots__ = ["__attrval"]
def __init__(self,value):
self.__attrval = value
@property
def var(self):
print 'getting the "var" attribute'
return self.__attrval
@var.setter
def var(self,value):
print 'setting the "var" attribute'
self.__attrval = value
@var.deleter
def var(self):
#print 'deleting the "var" attribute'
self.__attrval = None
obj = GetSet(100)
# print obj.__attrval # error
# obj.__attrval = 200 # error
print obj._GetSet__attrval # got it.
Вы просто заключаете соглашение, вы используете один _
сигнализировать пользователям вашей библиотеки, что это частный участник, и они уважают вас, потому что в противном случае их код клиента может столкнуться с последствиями в будущем.
Свойства удобны, потому что они позволяют полностью избежать геттеров и сеттеров. Если они понадобятся вам позже, вы можете добавить свойство.