使用描述符设置声明为 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_,这现在可以工作了。