Почему нельзя использовать слоты вместе с декораторами для обеспечения инкапсуляции в Python? - PullRequest
0 голосов
/ 25 октября 2018

Я читал, что в Python нет строгого контроля над инкапсуляцией. слотов обычно используется в целях более быстрого доступа к атрибутам и экономии памяти , как указано в здесь .Однако инкапсуляция может выполняться строго с использованием слотов и декораторов, как показано в следующем коде:

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 не будет иметь настройки динамических переменных (из-за слотов), а также установщик иМетоды getter будут вызывать определения методов в классе.Разве инкапсуляция не вызывается полностью?

1 Ответ

0 голосов
/ 25 октября 2018

Я читал, что в 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.

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

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

...