【问题标题】:Dataclass to ignore attribute in asdict in Python数据类在 Python 中忽略 asdict 中的属性
【发布时间】:2021-02-19 22:30:11
【问题描述】:

我正在使用数据类创建一个 Python Tkinter MVC 项目,我想通过迭代 asdict 方法生成的字典来创建小部件(当传递给视图时,通过控制器);但是,有些属性我不希望包含在小部件集中。在此编辑之前,我发布了类似于以下课程的内容(现在更具体地针对我正在从事的项目,感谢@Prune、@Cameron_McFee 和@Brian_McCutchon 的回复)。有没有办法从 asdict 方法中排除属性?在下面的示例中,我不想在字典中包含“客户”。

我尝试了,实验性地包括两个字段规范 - repr=False 和 init=False 在两个字段上,但我猜他们不会工作,他们不会。

@dataclass
class Product:
    name: str
    description: str = field(repr=False)
    N: float = field(init=False, default=0.0)
    P: float
    K: float
    _customer = None #class variable until assigned
    self._customer # but 'self' doesn't exist in this context.

    @property
    def customer(self):
        return self._customer

    @customer.setter
    def customer(self, value):
        self._customer = value

我知道有不同的方法来构造类来实现这一点,也许避免使用数据类,例如:

class Product:

    def __init__(self, name: str, description: str, N: float, P: float, K: float):
        self.name = name
        self.description = description
        self.N = N
        self.P = P
        self.K = K
        self._customer = None 

    @property
    def customer(self):
        return self._customer

    @customer.setter
    def customer(self, value):
        self._customer = value

这涉及到更多样板文件,如果可能的话,我想避免这些样板文件。一个不完美的类比是可以使用 Dapper 或 EF 实例化的 C# 模型。

【问题讨论】:

  • 你为什么要问我们它是否有效?您应该在发布之前知道,因为这是一个可测试的项目,因此超出了 Stack Overflow 的范围。 “Pythonic”是固执己见的,也是离题的,除非你能指出一个特定的技术并解释你对这一点的担忧。否则,您是在错误的网站上要求进行代码审查。

标签: python tkinter python-dataclasses


【解决方案1】:

来自PEP 557

数据类装饰器检查类以查找字段。字段定义为注释中标识的任何变量。即,具有类型注释的变量。除了下面描述的两个例外,数据类机制都不会检查注释中指定的类型。

所以它是有效的python代码,但_dib类变量(或dib属性)不会包含在生成的比较方法中,因为_dib不在__annotations__

【讨论】:

  • 我认为还有一个问题:_dib 在这种情况下不会是类变量吗?可能不是 OP 想要的。
  • 当然,这也是有问题的——但 getter 应该返回类变量 None ,直到 setter 应用实例变量代替它,对吗?所以它会像一个具有默认值的实例变量一样工作?
猜你喜欢
  • 1970-01-01
  • 2019-11-12
  • 2022-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
相关资源
最近更新 更多