Skip to content

Instantly share code, notes, and snippets.

@enven-omiomi
Created August 23, 2023 13:56
Show Gist options
  • Save enven-omiomi/f041d03895f8a8b27c7812ac7fee50d9 to your computer and use it in GitHub Desktop.
Save enven-omiomi/f041d03895f8a8b27c7812ac7fee50d9 to your computer and use it in GitHub Desktop.
python note
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