Was ich gelungen, so weit zu tun:
Ich habe eine elem
Klasse gemacht HTML-Elemente zu repräsentieren (div
, html
, span
, body
usw.).Mix-Typ() und benutzerdefinierte __init __() mit super() .__ init __()
Ich bin in der Lage, diese Klasse so derivatisieren Subklassen für jedes Element zu machen:
class elem:
def __init__(self, content="", tag="div", attr={}, tag_type="double"):
"""Builds the element."""
self.tag = tag
self.attr = attr
self.content = content
self.tag_type = tag_type
class head(elem):
"""A head html element."""
def __init__(self, content=None, **kwargs):
super().__init__(tag="head", content=content, **kwargs)
Und es funktioniert ziemlich gut.
Aber ich muss dies für jede Unterklasse Deklaration schreiben, und das ist ziemlich wiederholend und redundant, wenn ich jeden HTML-Tag-Typ machen will.
Also habe ich versucht, eine make_elem()
Funktion zu machen, die meine Klasse machen würde, indem ich den entsprechenden Tag-Namen als String-Parameter nehme.
So anstelle der bisherigen Klassendefinition, würde ich einfach so etwas wie dieses:
head = make_elem_class("head")
Wo ich bin stecken
Diese Funktion eine Klasse erstellen sollte. Und die __init__()
-Methode aus dieser Klasse sollte die __init__()
-Methode aus der Klasse aufrufen, von der sie erbt.
Ich habe versucht, diese make_elem_class()
Funktion zu machen, und es sah wie folgt aus:
def make_elem_class(name):
"""Dynamically creates the class with a type() call."""
def init(self, content=None, **kwargs):
super().__init__(tag=name, content=None, **kwargs)
return type(name, (elem,), {"__init__" : init})
Aber wenn html = make_elem_class('html')
läuft, dann html("html element")
ich die folgende Fehlermeldung erhalten:
Traceback (most recent call last):
File "elements.py", line 118, in <module>
html("html element")
File "elements.py", line 20, in init
super().__init__(tag=name, content=None, **kwargs)
TypeError: object.__init__() takes no parameters
Ich denke, dass es etwas mit dem leeren super()
Anruf zu tun, so versuchte ich stattdessen mit super(elem, self)
. Aber es funktioniert offensichtlich nicht besser.
Wie konnte ich das erreichen?
NB: Wenn ich die "__init__":init
vom Dictionnary im type()
Anruf zu entfernen, es funktioniert gut, aber der Tag ist nicht richtig eingestellt in meinem Elem. Ich habe auch versucht, {"tag":name}
zu type()
direkt zu übergeben, aber es hat auch nicht funktioniert.
Können Sie bitte auch eine vereinfachte 'elem' Klasse erstellen? Ich kann Ihre genaue Ausnahme auch nicht reproduzieren, stattdessen bekomme ich 'RuntimeError: super(): __class__ cell not found'. Benutzt du 'make_elem_class' vielleicht irgendwo als statische oder Klassenmethode? –
Oder hast du vielleicht '__class__ = elem' irgendwo gesetzt? –
@MartijnPieters Sicher! Ich habe meinen Beitrag bearbeitet, die '__init __()' Methode ist abgeschlossen. Und kein '__class__ = elem' in meinem Code. – vmonteco