首页 > 解决方案 > 如何在初始化时读取变量的名称并将其存储在 python 中的描述符类中?

问题描述

我的计划是这样的:使用 python 描述符,我想在赋值时读取变量的名称。当前代码:

class Decriptor:
    def __init__(self, field_type: typing.Type[typing.Any]):
        self.field_type = field_type
        self.value = None
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, constant):
        if issubclass(type(constant), self.field_type):
             self.value = constant
        else:
            raise TypeError(f"expected an instance of type {self.field_type.__name__} for attribute {}, got {type(constant).__name__} instead")

我使用描述符的原因是在编译时实现静态类型并为字段分配和声明提供一个包装器。如果我要在课堂上实现它......

class Foo:
    num = Decriptor(field_type=int)
    def __init__(self, num):
        self.z = num

目标:如何在没有直接引用的情况下将变量 num 的名称作为字符串并将其分配给 Descriptor 类中的字段,例如self.name?因此,当我更改类的不同实例中的值时,我可以只写instance.__dict__[self.name] = constant?

标签: pythonpython-descriptors

解决方案


从 Python 3.7 开始,我们有方法__set_name__,在初始化描述符时调用,它读取变量的名称

#add this to code
def __set_name__(self, owner, name):
    self.name = name

推荐阅读