在Python中是否可以對一個資料類實體的屬性進行迭代?例如,我想在__post_init__中把整數屬性加倍:
from dataclasses import dataclass, fields
@dataclass[/span
class Foo:
a: int
b: int in
def __post_init__(self):
self.double_attributes()
def double_attributes(self)。
for field in fields(Foo):
field = field*2
x = {
'a': 1,
'b': 2>>> TypeError: 不支持運算元 type(s) for *。'Field' and 'int'
如何訪問一個類的實體的值并將其設定為其他東西,就像下面這樣,但在一個回圈中?
@dataclass
class Foo:
a: int
b: int in
def __post_init__(self):
self.double_a()
self.double_b()
def double_a(self)。
self.a = self.a*2:self.a = self.a*2
def double_b(self)。
self.b = self.b*2。
uj5u.com熱心網友回復:
是的,這是有可能的。你可以這樣做
def double_attributes(self)。
for field in self.__dataclass_fields__:
value = getattr(self, field)
setattr(self, field, value * 2)
__dataclass_fields__回傳一個包含該物件所有欄位的字典。然后你可以使用 getattr 來檢索每個欄位的值,使用 setattr 來改變每個欄位的名稱值。
uj5u.com熱心網友回復:
你非常接近,但是dataclasses.fields實際上回傳一個Field物件的元組。至少在我的例子中,看起來回傳型別沒有被正確注釋,但是這很容易解決。
from dataclasses import dataclass, fields, Field
from typing import Tuple
@dataclass[/span
class Foo:
a: int
b: int in
def __post_init__(self):
self.double_attributes()
def double_attributes(self)。
# 注意這里添加的注釋(一個或多個的元組)。
# `dataclasses.Field`s)。
cls_fields。Tuple[Field, ...] = fields(self.__class__)
for field in cls_fields:
# 這個檢查是為了避免用其他型別注釋的欄位。
# 如`str`。
if issubclass(field.type, int) 。
new_val = getattr(self, field.name) * 2
setattr(self, field.name, new_val)
但是如果你要多次運行這個程式(例如創建許多Foo物件),那么快取欄位的串列可能會稍微有效一些,這些欄位是整數。例如,以下是我建議的偽代碼:
integer_fields: ClassVar[Frozenset[Field]] = frozenset(f for f in fields(cls) if issubclass(f. type, int)
uj5u.com熱心網友回復:
我認為最簡單的方法是使用typing.get_type_hints來檢索實體的注釋,而不是類的欄位。get_type_hints回傳一個字典,將類的屬性映射到它們被注釋的型別上。例如:
>>> from typing import get_type_hints
>>>
>>> class Bar:
... x: int
... y: str
...
>>> get_type_hints(Bar)
{'x': <class 'int'>, 'y': <class 'str'> }
>>> b = Bar()
>>> get_type_hints(b)
{'x': <class 'int'>, 'y': <class 'str'> }
正如你所看到的,get_type_hints對實體和對類一樣有效。
對于你的情況,你可以使用get_type_hints來解決你的情況,如下:
from dataclasses import dataclass
from typing import get_type_hints
@dataclass
class Foo:
a: int
b: int in
def __post_init__(self):
self.double_attributes()
def double_attributes(self)。
for field_name, field_type in get_type_hints(self).items()。
if issubclass(field_type, int)。
current_val = getattr(self, field_name)
setattr(self, field_name, (current_val * 2)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/310700.html
標籤:
上一篇:Enumerate()函式或類?
