我有兩個資料類,我需要在它們兩個上添加動態生成的屬性“代碼:名稱的小寫版本”
我做的第一個
@dataclass()
class FirstClass:
name: str
code: Optional[str] = field(init=False)
def __post_init__(self):
self.code = self.name.lower()
使用 init=False 我不需要在建構式中提供它,因為無論如何都會生成它
但是第二類是凍結的,因為我快取了它的回傳,因為它太大而且每次都讀起來太貴
@dataclass(frozen=True)
class SecondClass:
name: str
無論如何在init期間添加動態生成的屬性而不是post_init,因為凍結的資料類是只讀的
所以我想做類似的事情
@dataclass(frozen=True)
class SecondClass:
name: str
code: str = name.lower()
uj5u.com熱心網友回復:
一種選擇是用來object.__setattr__
繞過資料類被凍結的事實:
from dataclasses import dataclass, field
@dataclass(frozen=True)
class SecondClass:
name: str
code: 'str | None' = field(init=False)
def __post_init__(self, ):
object.__setattr__(self, 'code', self.name.lower())
print(SecondClass('Test'))
另一種選擇可能是添加一個輔助類方法new()
,該方法可用于實體化一個新SecondClass
物件:
from dataclasses import dataclass
@dataclass(frozen=True)
class SecondClass:
name: str
code: 'str | None'
@classmethod
def new(cls, name: str):
return cls(name, name.lower())
print(SecondClass.new('Hello'))
uj5u.com熱心網友回復:
另一種方法,使用@property
- 不會存盤code
在類中,而是將其作為屬性公開:
@dataclass(frozen=True)
class SecondClass:
name: str
@property
def code(self):
return self.name.lower()
print(SecondClass('Me').code)
結果:
me
uj5u.com熱心網友回復:
我將第一種方法與自定義創建功能結合使用:
@dataclass(frozen=True)
class SecondClass:
name: str
code: Optional[str]
def create_second(name):
return SecondClass(name, name.lower())
print(create_second('Me'))
結果:
SecondClass(name='Me', code='me')
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507955.html