Ich bin ein Website-Generator mit verschiedenen Klassen schreiben, die die Inhalte in den Web-Seiten darstellen wie Page
, NewsPost
, Tag
, Category
usw.Kontextuell Injektion statische Klasseneigenschaften in Python
Ich mag würde in der Lage sein konstruiere diese Objekte einfach, und damit habe ich kein Problem.
Allerdings möchte ich auch diese Objekte in einem bestimmten Kontext konstruieren - sagen wir der Kontext einer Website mit einer bestimmten Root-URL. Angenommen, ich lege diesen Kontext in eine Instanz einer Klasse ContentManager
. Dies ist der Code, den ich hoffe, bis schließlich am Ende mit:
page = Page(title='Test Page', content='hello world!')
assert page.cm == None
cm = ContentManager(root_url='//localhost')
page = cm.Page(title='Test Page', content='hello world!')
assert page.cm == cm
ich diese einfach verwalten kann, wenn page.cm
ist eine pro-Instanz Eigenschaft in __init__
gesetzt, aber ich brauche Klassenmethoden auf cm.Page
nennen, die den Zugriff auf die Notwendigkeit cm
Objekt, also muss es eine statische Eigenschaft sein.
Wenn ich es nur als statische Eigenschaft auf der Klasse Page
gesetzt, wäre es andereContentManager
s Seiten und am Ende zu beeinflussen, was nicht erwünscht ist.
Wie würde ich das erreichen? Metaklassen? Oder eine Art Klassenfabrikfunktion?
Sie machen es entweder zu einer Instanz oder zu einem Klassenattribut/-eigenschaft, es gibt keine anderen Möglichkeiten, selbst wenn Sie Metaklassenzauber einführen. Es scheint eher, dass Sie ein Instanzattribut benötigen und ein Teil Ihres Codes von Klassenmethoden in Instanzmethoden verschoben werden muss, um Zugriff auf diese Instanzvariablen zu haben. – pasztorpisti
Variablen (nicht-const Daten) zu statisch/global/shared/was auch immer zu platzieren ist eine schlechte Übung im Allgemeinen (auch in anderen Programmiersprachen). Es weist normalerweise auf ungeeignetes Design hin, das neu überdacht werden muss. – pasztorpisti
Ich denke, Sie haben Recht, aber angesichts der (mangelnden) Wichtigkeit und des kleinen Umfangs des Projekts, entschied ich, dass es sich lohnen würde, wenn es machbar wäre. – Andreas