Hacktoberfest 2026:维护者为十月标记出来的 issue,仍然开放、适合新手。 浏览 Hacktoberfest issue

slots declared on attrs-decorated class are ignored/lost

未关闭
#1,637 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 2 天内回复

@anshurajbisoyi98-ctrl 已经在做这个了。

开始于 2026年10月3日。

  • #1638 来自 @anshurajbisoyi98-ctrl —— 未关闭
  • #1645 来自 @kevindurant735rocket-creator —— 未关闭

评估

难度
3/5
预计耗时
1-2 天
新手友好度
68/100
Issue 类型
缺陷
描述清晰度
基本清楚
活跃度
活跃
技术栈
python

调研方向

Start by reproducing the two examples in the issue and compare how attrs processes slots declared on the class with slots inherited from a base class. Trace the slot-processing entry point and add a regression test for preserving a class-declared private slot; done means assigning that slot works while it remains outside attrs fields and generated methods.

由索引模型根据 Issue 内容生成。

描述

If a slotted attrs class declares its own slots, those slots are lost/ignored when the class is processed by attrs. E.g.

@attrs.define
class A:
    __slots__ = ("private",)

    public: str = "foo"

a = A()

a.private = 1

produces the error TypeError: descriptor 'private' for 'A' objects doesn't apply to a 'A' object.

However, declaring an attrs class that subclasses a class that defines slots, the parent class's slots are preserved. E.g.

class Base:
    __slots__ = ("private",)

@attrs.define
class B(Base):
    public: str = "bar"

b = B()

b.private = 1

sets the slots attribute without issue.

Is this intentional behavior or dictated by the design of attrs? I've looked at the code and it looks like it goes out and gets slots defined on base classes and adds them to the slots defined on the new class. Using that same method, it doesn't look like it would be hard to preserve slots declared on the slotted attrs class itself, but I haven't tried to code it and I don't know if it would break something I'm not seeing. (Note that declaring __slots__ on a class decorated with @attrs.define(slotted=False) doesn't work for other reasons, so this question/issue really only applies to slotted attrs classes).

It can often be useful to have private attributes on a class that may be used for internal instance management but aren't really part of the data model represented by the class and should be ignored by attrs--not included in the init or hash or equality functions. This can, of course, be accomplished by declaring the attribute with init=False, hash=False, and eq=False, but the attribute still shows up in the collections returned by attrs.fields or attrs.fields_dict and is serialized by attrs.asdict (which, similarly, can be worked around with a filter). Declaring slots would be a simple way to allow an instance to have attributes that attrs is entirely unaware of. Using a base class is a workaround, but it would be preferable not to have to create a separate base class or mixin solely to add extra slots.

主要语言
Python
星标
5.9k
派生
501
平均合并
4 天 18 小时
30 天内合并 PR
5

环境准备

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

python-attrs/attrs 的其他 Issue

查看 python-attrs/attrs 的全部 Issue

相似的 Issue

更多 Python Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。