Bisher habe ich in Python immer Funktionen geschrieben und wollte nun mein aktuelles Programm in eine Klassenhierachie übersetzen, quasi auch um das zu üben. Jetzt hab ich irgendwie einen Knoten im Gehirn. Vielleicht könnt ihr mir da weiterhelfen?
Folgendes Programm:
Code: Alles auswählen
import sys, urllib.request
class URL_MASTER():
def __init__(self, eingabe_url, url, html_home):
self.eingabe_url = input("Bitte URL eingeben:")
self.url = urllib.request.urlopen \
(self.eingabe_url)
self.url.close()
self.html_home = self.url.readlines()
self.html_home = str(self.html_home)
class URL_SLAVE(URL_MASTER):
def __init__(self, eingabe_url, url, html_home, eingabe_query, soup, html_home_sublinks):
URL_MASTER.__init__(self, eingabe_url, url, html_home)
self.eingabe_query = input("Bitte Suchwort eingeben:")
self.soup = BeautifulSoup(self.html_home, 'html.parser')
self.html_home_sublinks = [a['href'] for a in self.soup.find_all('a', href=True) if a.text]
self.html_home_sublinks = set(self.html_home_sublinks)
self.html_home_sublinks = list(self.html_home_sublinks)
def ausgabe(self):
print(self.html_home)
# Zugriffsobjekte auf Klasse
if __name__ == "__main__":
#TESTOBJEKT1 = URL_MASTER(eingabe_url=[], url=[], html_home=[])
TESTOBJEKT2 = URL_SLAVE(eingabe_url=[], url=[], html_home=[], eingabe_query=[], soup=[], html_home_sublinks=[])
TESTOBJEKT.ausgabe()
Ich störe mich aber an der Deklaration BEVOR ich diese eigentlich in der Klasse machen möchte. In den ganzen Tutorials werden oft einfache Zahlen übergeben, das ist alles klar. Aber das hilft mir hier nicht weiter. Der Konstruktor erwartet ja eine definierte Variable...wenn ich einfach nur schreibe:
Code: Alles auswählen
TESTOBJEKT1 = URL_MASTER(eingabe_url, url, html_home)
NameError: name 'eingabe_url' is not defined
Aber die Definierung dieser Variable möchte ich ja eigentlich innerhalb der Klasse machen und nicht außerhalb...sonst bräuchte ich keine Klasse und könnte einfach weiterhin Funktionen schreiben.
Außerdem möchte ich von der Basisklasse URL_MASTER() eigentlich auch nur html_home haben und den Rest nicht, aber der Konstruktor von URL_SLAVE() erwartet die gesamte Liste...aber das ist ein Folgeproblem


Könnt ihr mir sagen, wo mein Denkfehler ist? Also zusammengefasst:
In der Klasse URL_MASTER() wird der HTML Quellcode der Eingabe (z.B. https://www.python-forum.de/) in die Variable self.html.home eingelesen.
Diese Variable brauche ich dann in der Klasse URL_SLAVE(), wo ich diese Seite nach allen Sublinks (<a.href>) durchsuche und das Ergebnis sortiert in einer Liste speichere. Wie gesagt, geschrieben als Funktion funktioniert das alles prima...
