Created
August 23, 2023 13:56
-
-
Save enven-omiomi/f041d03895f8a8b27c7812ac7fee50d9 to your computer and use it in GitHub Desktop.
python note
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from dataclasses import Field, dataclass, field, fields | |
from typing_extensions import dataclass_transform | |
class FieldDescriptor: | |
def __init__(self, field: Field): | |
self.field = field | |
def __get__(self, instance, owner): | |
if instance is None: | |
return self.field | |
return instance.__dict__.get(self.field.name) | |
def __set__(self, instance, value): | |
instance.__dict__[self.field.name] = value | |
@dataclass_transform(field_specifiers=(field, Field)) | |
class Base: | |
def __init_subclass__(cls) -> None: | |
super().__init_subclass__() | |
dataclass(cls) | |
_fields = fields(cls) # type: ignore | |
for f in _fields: | |
setattr(cls, f.name, FieldDescriptor(f)) | |
class Foo(Base): | |
f1: str | |
if __name__ == "__main__": | |
print(type(Foo.f1)) # -> <class 'dataclasses.Field'> | |
print(Foo.__dict__) | |
obj = Foo(f1="fff") | |
print(type(obj.f1)) # -> <class 'str'> | |
print(obj.f1) | |
print(f"{obj.__class__.__name__}.{obj.__class__}") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment