为什么插槽不能与装饰器一起使用以在 Python 中强制封装?

Why can't slots be used alongside decorators to enforce encapsulation in Python?

我了解到 Python 中没有严格执行封装。 slots 通常用于 更快的属性访问 内存节省 的目的,如 here.但是,是否可以像以下代码所示那样使用插槽和装饰器来严格执行封装:

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 方法将调用 class 中的方法定义。封装不是完全调用了吗?

I've read that there is no strict enforcement of Encapsulation in Python.

因为属性总是 public。而且无论您做什么,都可以联系到他们,即使您使用 __ 成员前缀:

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.

您只是按照惯例进行封装,您使用单个 _ 来向您的库代码用户表明这是私有成员并且他们尊重您,否则他们的客户端代码可能会在未来面临后果。

属性很方便,因为它们可以让您完全避免 getter 和 setter。如果您以后需要它们,您可以添加 属性.