2009-04-26 9 views
3

Ich definiere einige Entitäten, die gut funktioniert; für Meta-Programmierung Probleme. Ich muss nun die Feldeigenschaften widerspiegeln, die im Modell definiert sind.Elixir Reflexion

Zum Beispiel:

class Foo(Entity): 
     bar = OneToMany('Bar') 
     baz = ManyToMany('Baz') 

Welche Art von Beziehung gesetzt: "ManyToMany", "OneToMany" oder auch ein einfaches "Feld" und die Beziehung Ziel?

Gibt es eine einfache Möglichkeit, die Elixir Entities zu reflektieren?

Antwort

4

Sie können in Elixir tun Innerlichkeit, wie Sie überall in Python würden - alle Namen von Attributen von class Foo mit dir(Foo) erhalten, extrahieren ein seinen Namen gegeben Attribut mit getattr(Foo, thename), überprüfen Sie die Art des Attributs mit type(theattr) oder isinstance usw. Die Zeichenfolge 'Bar', die Sie dem Konstruktor einer beliebigen Relationship-Unterklasse (einschließlich OneToMany und ManyToMany) als Attribut übergeben, endet als r.of_kind-Attribut der resultierenden Instanz r der Relationship-Unterklasse.

Modul inspect in der Python-Standard-Bibliothek kann eine freundlichere Möglichkeit, Introspektion zu tun, aber dir/getattr/isinstance & c sind in vielen Fällen durchaus akzeptabel.