2

这个问题在 2016 年被问到,但没有得到回答:可以将描述符分配给实例属性而不是类属性吗?

我有一个基本的描述符

class MyThing:
    def __set_name__(self, owner, name):
        print(f'Assigned to {name} on {owner}')
        self.name = name

    def __get__(self, obj, typ):
        print(f'Getting {self.name} on {obj}')
        return getattr(obj, self.name)

    def __set__(self, obj, val):
        print(f'Setting {self.name} on {obj} to {val}')
        setattr(obj, self.name, val)

是否可以在运行时将此描述符的实例分配给其他类实例,并使其行为符合描述符协议?

天真的方法失败了:

foo.thing = MyThing()

foo.thing不像一个描述符,它只是像一个典型的实例属性。

这不是 XY 问题。正如我所说的那样,我特意要求回答这个问题。

4

1 回答 1

1

不,描述符协议仅在描述符对象是类的成员时才有效,这在 HOWTO中有说明:

要使用描述符,必须将其作为类变量存储在另一个类中

或者,来自数据模型文档

以下方法仅适用于包含该方法的类的实例(所谓的描述符类)出现在所有者类中(描述符必须在所有者的类字典或其父类之一的类字典中)。

于 2021-07-02T03:33:51.190 回答