簡體   English   中英

Python,為什么dataclass屬性是只讀的?

[英]Python, why is the dataclass attribute read-only?

我有一個數據類,它的簽名在啟動之前會根據活動配置進行更新,並且可以在啟動后進行修改。 因此,我有這樣的事情:


from dataclasses import dataclass, field


@dataclass(slots=True, frozen=False)
class MyClass:
    att_1: str = field(init=False)
    att_2: str = field(init=False)

    @classmethod
    def update_class(cls, first, second):
        cls.att_1 = first
        cls.att_2 = second

我的問題是,雖然數據類沒有被凍結,但當我啟動類時,我不能再更改屬性了。 這是我所做的一個示例。


MyClass.update_class("11", "12")
print(MyClass.att_1)
a = MyClass()

print(a)
print(MyClass.att_2)
print(MyClass.att_1)
a.att_2 = "002"
print(a)

運行這個我得到如下所示:


11
MyClass(att_1='11', att_2='12')
12
11
Traceback (most recent call last):
  File "/b.py", line 25, in <module>
    a.att_2 = "002"
AttributeError: 'MyClass' object attribute 'att_2' is read-only

有人可以告訴我為什么att_2是只讀的,我該如何解決?

所以,問題是你正在使用__slots__然后刪除__slots__描述符,破壞了你的課程。 所以,考慮(不涉及dataclass ):

>>> class Foo:
...     __slots__ = "x", "y"
...
>>> foo = Foo()
>>> foo.x = 1
>>> foo.x
1
>>> Foo.x
<member 'x' of 'Foo' objects>
>>> Foo.x = None
>>> foo.x
>>> foo.x = 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object attribute 'x' is read-only

所以,一個簡單的解決方案是不使用__slots__ ,但我真的不清楚這一切應該如何工作,或者為什么你有一個update_class方法(以及它應該完成什么)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM