Code: Select all
class Column:
def __init__(self, s: str) -> None:
self.name = s
class Meta(type):
def __new__(cls, name: str, bases: tuple[type, ...], namespace: dict[str, Any]) -> type:
annotations = namespace.get('__annotations__', {})
namespace.update({k: Column(k) for k in annotations})
return super().__new__(cls, name, bases, namespace)
class Base(metaclass=Meta):
def __init__(self, data: dict[str, Any]) -> None:
if self.__class__ == Base:
raise RuntimeError
self.__dict__ = data
< /code>
Lassen Sie uns nun ein Beispiel geben. Die Basisklasse sollte vererbt werden und dann erstellen wir ein Objekt zum Testen (und wir gehen davon aus, dass die übergebenen Daten korrekt sind): < /p>
class Human(Base):
name: str
height: int
tom = Human({'name': "Tom", 'height': 180})
Human.height # Column(name="height")
tom.height # 180
< /code>
Wenn wir jetzt auf ein Feld aus der Klasse zugreifen, erhalten wir eine Spalte mit dem Namen des Feldes zurück. Wenn wir von einer Instanz wie Tom
kommt jetzt die Frage:
Gibt es einen Trick oder eine Problemumgehung, damit der Typ -Checker versteht, dass Human.Height Spalte Typ ist , ohne das gleiche Feld zweimal das gleiche Feld, das zweimal das gleiche wie folgt ist: , müsste hier folgendes folgt:
Code: Select all
class Human(Base):
name: str
name: ClassVar[Column]
height: int
height: ClassVar[Column]