gpt4 book ai didi

Python卡住数据类,允许通过方法更改属性

转载 作者:行者123 更新时间:2023-12-04 12:16:47 24 4
gpt4 key购买 nike

假设我有一个数据类:

@dataclass(frozen=True)
class Foo:
id: str
name: str

我希望这是不可变的(因此是 frozen=True ),这样 foo.id = barfoo.name = baz失败。但是,我希望能够剥离 id,如下所示:
foo = Foo(id=10, name="spam")

foo.strip_id()
foo
-> Foo(id=None, name="spam")

我尝试了一些东西,覆盖 setattr ,但没有任何效果。有没有优雅的解决方案? (我知道我可以编写一个方法来返回一个相同的新卡住实例,只是该 id 已被剥离,但这似乎有点hacky,它需要我做 foo = foo.strip_id() ,因为 foo.strip_id() 实际上不会更改 foo )

编辑:

尽管一些评论者似乎不同意,但我认为“完全可变,随心所欲”和“不可变,除非以这种特殊的、严格控制的方式”之间存在合理的区别

最佳答案

嗯,直接修改__dict__就可以了使用 object.__setattr__(...) 修改属性的实例成员1,但是为什么???专门要求不可变,然后使其可变是......优柔寡断。但如果你必须:

from dataclasses import dataclass

@dataclass(frozen=True)
class Foo:
id: str
name: str
def strip_id(self):
object.__setattr__(self, 'id', None)

foo=Foo(10, 'bar')

>>> foo
Foo(id=10, name='bar')
>>> foo.strip_id()
>>> foo
Foo(id=None, name='bar')

这样做的任何方式都可能看起来很笨拙……因为它需要做的事情从根本上与设计相反。

如果您将此用作其他程序员不应修改值的信号,则通常在 Python 中完成的方法是在变量名称前加上一个下划线。如果您想这样做,同时还可以访问这些值,也许这样的事情会起作用:

from dataclasses import dataclass

@dataclass
class Foo:
_id: str
_name: str
def strip_id(self):
self.__dict__['id'] = None
def get_id(self):
return self._id

1:根据@Arne 的回答进行修改,他观察到不能保证内部使用字典作为数据容器。

关于Python卡住数据类,允许通过方法更改属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60699202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com