数据类和属性装饰器

2022-04-11 00:00:00 python python-3.7 python-dataclasses

问题描述

我一直在研究作为命名元组(必须在结构中分组数据时通常使用的)的替代方案的Python3.7的数据类。我想知道数据类是否与属性修饰符兼容,以便为数据类的数据元素定义getter和setter函数。如果是这样的话,这是在什么地方描述的吗?或者有可用的例子吗?


解决方案

确实有效:

from dataclasses import dataclass

@dataclass
class Test:
    _name: str="schbell"

    @property
    def name(self) -> str:
        return self._name

    @name.setter
    def name(self, v: str) -> None:
        self._name = v

t = Test()
print(t.name) # schbell
t.name = "flirp"
print(t.name) # flirp
print(t) # Test(_name='flirp')

事实上,为什么不应该呢?最后,您得到的只是一个很好的老类,派生自类型:

print(type(t)) # <class '__main__.Test'>
print(type(Test)) # <class 'type'>

也许这就是为什么没有特别提到属性的原因。然而,PEP-557's Abstract提到了众所周知的Python类特性的一般可用性:

因为数据类使用标准的类定义语法,所以您是自由的 要使用继承、元类、文档字符串、用户定义的方法, 类工厂和其他Python类功能。

相关文章