使用描述符设置声明为 in__slots__ 的属性时,对象没有属性
Object has no attribute when setting an attribute declared in__slots__ with desciptors
我有这个 class,它使用插槽和描述符。
我将变量的名称放在 __slots__
中,并使用描述符来设置它们的值。
class Example:
__slots__ = ('__x', '__y') #see the double undescores
_x = descriptor_of_x()
_y = descriptor_of_y()
def __init__(self, x, y):
self._x = x
self._y = y
描述符看起来像这样。
class descriptor_of_x:
__slots__ = ('name')
def __set_name__(self, owner, name):
# the name of the variable that will be set is
# the name of the variable that called it prepended with a underscore.
self.name = f"_{name}"
def __set__(self, obj, value):
setattr(obj, self.name, value)
def __get__(self, obj, objtype=None):
return getattr(obj, self.name)
当我 运行 我得到:
'Example' object has no attribute '__x'
当我删除 __slots__
然后在实例上使用 vars()
例如,
我可以在结果字典中清楚地看到 __x
和 __y
。
所以,名称是正确的,我肯定把它们放在插槽中,但找不到它们。
我在这里错过了什么?变量是在 __slots__
之前声明的吗?
来自 te 文档:
the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam
创建插槽时,带双下划线的项目将被重命名,
这就是找不到它们的原因。
更改了描述符以附加下划线而不是前置,现在插槽中的变量应该是_x_和_y_,这现在可以工作了。
我有这个 class,它使用插槽和描述符。
我将变量的名称放在 __slots__
中,并使用描述符来设置它们的值。
class Example:
__slots__ = ('__x', '__y') #see the double undescores
_x = descriptor_of_x()
_y = descriptor_of_y()
def __init__(self, x, y):
self._x = x
self._y = y
描述符看起来像这样。
class descriptor_of_x:
__slots__ = ('name')
def __set_name__(self, owner, name):
# the name of the variable that will be set is
# the name of the variable that called it prepended with a underscore.
self.name = f"_{name}"
def __set__(self, obj, value):
setattr(obj, self.name, value)
def __get__(self, obj, objtype=None):
return getattr(obj, self.name)
当我 运行 我得到:
'Example' object has no attribute '__x'
当我删除 __slots__
然后在实例上使用 vars()
例如,
我可以在结果字典中清楚地看到 __x
和 __y
。
所以,名称是正确的,我肯定把它们放在插槽中,但找不到它们。
我在这里错过了什么?变量是在 __slots__
之前声明的吗?
来自 te 文档:
the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam
创建插槽时,带双下划线的项目将被重命名, 这就是找不到它们的原因。
更改了描述符以附加下划线而不是前置,现在插槽中的变量应该是_x_和_y_,这现在可以工作了。