为什么插槽不能与装饰器一起使用以在 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。如果您以后需要它们,您可以添加 属性.
我了解到 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。如果您以后需要它们,您可以添加 属性.