Почему нельзя использовать слоты вместе с декораторами для обеспечения инкапсуляции в 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.

Вы просто заключаете соглашение, вы используете один _ сигнализировать пользователям вашей библиотеки, что это частный участник, и они уважают вас, потому что в противном случае их код клиента может столкнуться с последствиями в будущем.

Свойства удобны, потому что они позволяют полностью избежать геттеров и сеттеров. Если они понадобятся вам позже, вы можете добавить свойство.

Другие вопросы по тегам