首页 > 解决方案 > Python没有在自定义集属性上调用描述符函数

问题描述

我正在尝试创建一个遗留数据类函数并且已经能够成功地覆盖__init__。我的新问题是属性的__set__and__get__方法似乎没有被调用,所以它返回实际属性而不是调用 get 函数将用完全不同的值覆盖属性而不是调用 set()。

def _init_wrapper(self, *props):
    names = _filter_names(self) # Get names of all properties

    for name, value in zip(names, props):
        private = _private_name(name) # Get private name for property

        _create_field(self, private) # Create field for property
        setattr(self, private, value)

        prop = property(lambda i: getattr(i, private), lambda i, v: setattr(i, private, v)) # Return private, set private
        setattr(self, name, prop)


def dataclass(cls):
    setattr(cls, "__init__", _init_wrapper)

    return cls


@dataclass
class Vehicle:
    Name = ""
    Brand = ""
    Speed = 0

x = Vehicle("Foo", "Bar", 100)

print(x.Name)
x.Name = "Baz"
print(x.Name)

输出:

<property object at 0x00000201EFAD2A40>
Baz

我对 setattr、描述符和装饰器非常陌生,所以如果它很明显或者整个方法有问题,我很抱歉。

标签: pythonoopproperties

解决方案


推荐阅读