代码之家  ›  专栏  ›  技术社区  ›  shadowtalker

是否有方法在运行时为实例属性分配描述符

  •  0
  • shadowtalker  · 技术社区  · 3 年前

    这个问题在2016年被提出,但没有得到回答: Can a descriptor be assigned to an instance attribute instead of a class attribute?

    我有一个基本的描述符

    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问题。正如我所述,我特别要求回答这个问题。

    0 回复  |  直到 3 年前
        1
  •  1
  •   juanpa.arrivillaga    3 年前

    否,描述符协议仅在描述符对象为 班级成员 ,这是int the HOWTO :

    要使用描述符,它必须作为类变量存储在 另一类

    或者,从 data model docs :

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