Hallo ich hab folgendes Problem: Ich möchte einige Methoden einer Klasse verwenden ohne zuvor eine Instanz der Klasse anlegen zu müssen. Wie ich in Erfahrung gebracht habe ist dies mit dem Schlüsselwort @classmethod vor der eigentlichen Methode möglich wenn diese Methode ihre Zugriffe über cls und nicht self referenziert. Offensichtlich ist es mir allerdings nicht möglich eine Methode der Klasse hiermit zu verwenden die sich auf eine Instanz bezieht also mit def foo(self, ...) erstellt ist? Gibt es eine Möglichkeit dies zu lösen oder muss ich jetzt alle Methoden der Klasse als Klassenmethoden ausweisen und cls statt self verwenden? Hierbei würde es allerdings wenig Sinn machen noch eine Klasse zu definieren, da könnte ich ja auch alle Methoden direkt in ein modulfile schreiben. Hier ein kleines Beispiel was ich meine: << class ModulTest(): ''' Kurze Beschreibung der Klasse und ihrer Mehtoden ''' Liste= [] String = "0" fl_val = 0.0 int_val = 0 def __init__(self): ''' Kurze Beschreibung der Funktion Kurze Beschreibung der Argumente Kurze Beschreibung der Rueckgabewerte ''' pass def verarbeite(self, Zahl): self.String = str(Zahl) for i in self.String: self.Liste.append(i) @classmethod def getOutput(cls, zahl): cls.verarbeite(zahl) print cls.String
Aufgerufen soll es wie folgt werden:
From modultest import ModulTest as mt mt.getOutput(12)
Schon jetzt vielen Dank für Eure Ratschläge Gruß Frank -- Bevor Sie diese E-Mail ausdrucken, überlegen Sie bitte, ob dies wirklich erforderlich ist. Please think before you print. -- WIKA Alexander Wiegand SE & Co. KG Alexander-Wiegand-Straße 30 - 63911 Klingenberg - Germany Kommanditgesellschaft: Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 1819 Komplementärin: WIKA Verwaltungs SE & Co. KG - Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 4685 Komplementärin: WIKA International SE - Sitz Klingenberg - Amtsgericht Aschaffenburg HRB 10505 Vorstand: Alexander Wiegand Vorsitzender des Aufsichtsrats: Dr. Max Egli Telefon: (09372) 132-0 Internet: www.wika.com -- The information contained in this E-Mail and any attached files are strictly confidential and may be subject to legal privilege. If you are not the intended recipient, his representative or the person responsible for delivering the message to the intended recipient, be advised that you have received this message in error and that any dissemination, copying or use of this message or attachment is strictly forbidden, as is the disclosure of the information therein. If you have received this E-Mail in error, please notify us immediately by E-Mail or telephone and delete this message and all its attachments subsequently. All reasonable precautions have been taken to ensure no viruses are present in this E-Mail.
Hallo Frank,
Ich möchte einige Methoden einer Klasse verwenden ohne zuvor eine Instanz der Klasse anlegen zu müssen.
Wie ich in Erfahrung gebracht habe ist dies mit dem Schlüsselwort @classmethod vor der eigentlichen Methode möglich wenn diese Methode ihre Zugriffe über cls und nicht self referenziert.
Offensichtlich ist es mir allerdings nicht möglich eine Methode der Klasse hiermit zu verwenden die sich auf eine Instanz bezieht also mit def foo(self, …) erstellt ist?
Gibt es eine Möglichkeit dies zu lösen oder muss ich jetzt alle Methoden der Klasse als Klassenmethoden ausweisen und cls statt self verwenden? Hierbei würde es allerdings wenig Sinn machen noch eine Klasse zu definieren, da könnte ich ja auch alle Methoden direkt in ein modulfile schreiben.
Wie soll denn das gehen? Nehmen wir mal an du hast 1000 Instanzen der Klasse A. Und jetzt rufst du von deiner Klassenmethod eine "normale", sprich Instanzmethode, auf. Welche der 1000 Instanzen solls denn dann bitteschoen sein? Soll das per Los entschieden werden, oder die letzte, oder erste, oder …. Mit anderen Worten: ja, aus Klassenmethoden kannst du nur auf Klassenmethoden (oder anderen Code) zugreifen. Wie waere es, wenn du mal dein konkretes Beispiel erlaeuterst, warum du das ueberhaupt tun willst?
Hier ein kleines Beispiel was ich meine:
<< class ModulTest(): ''' Kurze Beschreibung der Klasse und ihrer Mehtoden ''' Liste= [] String = "0" fl_val = 0.0 int_val = 0
Das hier ist in vielerlei hinsicht grosser Unfug - ich glaube nicht, dass dir bewusst ist, was du da eigentlich genau tust. Alle diese Werte sind *KLASSENATTRIBUTE*. Mit anderen Worten: jede Instanz teilt sich genau *EINE* "Liste". Damit endent also jede Zahl aus "verarbeite" in einer einzigen, globalen Liste. Zum zweiten ist deine Benennung mehr als fragwuerdig. Weder in Python noch in anderes Programmiersprachen sollte man Namen von Attributen/Variablen mit ihrem Typ qualifizieren. Denn wenn aus der Liste ein Dictionary oder aus int_val ein float wird, geht das grosse Zaehneklappern los. Sprechende Namen bezeichen den Verwendungszweck - nicht den Typ. Last but not Least - der bestaendige Wechsel zwischen CamelCase und kleinschreibung_mit_unterstrichen ist inkonsistent und damit schlecht zu lesen. Standard in Python ist letzteres, anders machen kannst du's natuerlich trotzdem - aber mischen sollte man nicht.
def __init__(self): ''' Kurze Beschreibung der Funktion Kurze Beschreibung der Argumente Kurze Beschreibung der Rueckgabewerte ''' pass
def verarbeite(self, Zahl): self.String = str(Zahl) for i in self.String: self.Liste.append(i)
Diese Methode braucht ja auch (bei der gegebenen, ggf. fehlerhaften Implementierung) kein self, weil sie an die globale "Liste" anfuegt. Also kannst du die auch zur classmethod machen. Ob das sinnvoll ist - keine Ahnung. Und zu guter letzt: muss das mit dem riesen Bild als Anhang sein? Diese Liste ist werbefrei - und sollte das auch bleiben finde ich. Diez
Hallo Frank! Hier, ich habe dir ein kleines Sample geschrieben: class MeineKlasse: Variable = 'Hallo' def MeineFunk(ds): print 'Hallo %s, ich bin eine statische Methode!' % (ds) print MeineKlasse.Variable MeineFunk = staticmethod(MeineFunk) MeineKlasse.MeineFunk('Tamer') print MeineKlasse.Variable Hier zum nachlesen: http://openbook.galileocomputing.de/python/python_kapitel_12_001.htm Tamer On 07/19/13 15:23, Wagner, Frank wrote:
Hallo ich hab folgendes Problem:
Ich möchte einige Methoden einer Klasse verwenden ohne zuvor eine Instanz der Klasse anlegen zu müssen.
Wie ich in Erfahrung gebracht habe ist dies mit dem Schlüsselwort @classmethod vor der eigentlichen Methode möglich wenn diese Methode ihre Zugriffe über cls und nicht self referenziert.
Offensichtlich ist es mir allerdings nicht möglich eine Methode der Klasse hiermit zu verwenden die sich auf eine Instanz bezieht also mit def foo(self, …)
erstellt ist?
Gibt es eine Möglichkeit dies zu lösen oder muss ich jetzt alle Methoden der Klasse als Klassenmethoden ausweisen und cls statt self verwenden? Hierbei würde es allerdings wenig Sinn machen noch eine Klasse zu definieren, da könnte ich ja auch alle Methoden direkt in ein modulfile schreiben.
Hier ein kleines Beispiel was ich meine:
<<
class ModulTest():
''' Kurze Beschreibung der Klasse
und ihrer Mehtoden
'''
Liste= []
String = "0"
fl_val = 0.0
int_val = 0
def __init__(self):
''' Kurze Beschreibung der Funktion
Kurze Beschreibung der Argumente
Kurze Beschreibung der Rueckgabewerte
'''
pass
def verarbeite(self, Zahl):
self.String = str(Zahl)
for i in self.String:
self.Liste.append(i)
@classmethod
def getOutput(cls, zahl):
cls.verarbeite(zahl)
print cls.String
Aufgerufen soll es wie folgt werden:
From modultest import ModulTest as mt
mt.getOutput(12)
Schon jetzt vielen Dank für Eure Ratschläge
Gruß
Frank
--
--
P */Bevor Sie diese E-Mail ausdrucken, überlegen Sie bitte, ob dies wirklich erforderlich ist. Please think before you print./*
--
*WIKA Alexander Wiegand SE & Co. KG*
*Alexander-Wiegand-Straße 30 - 63911 Klingenberg - Germany*
Kommanditgesellschaft: Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 1819
Komplementärin: WIKA Verwaltungs SE & Co. KG - Sitz Klingenberg -
Amtsgericht Aschaffenburg HRA 4685
Komplementärin: WIKA International SE - Sitz Klingenberg -
Amtsgericht Aschaffenburg HRB 10505
Vorstand: Alexander Wiegand
Vorsitzender des Aufsichtsrats: Dr. Max Egli
Telefon: (09372) 132-0
Internet: www.wika.com <http://www.wika.com>
--
The information contained in this E-Mail and any attached files are strictly confidential and may be subject to legal privilege. If you are not the intended recipient, his representative or the person responsible for delivering the message to the intended recipient, be advised that you have received this message in error and that any dissemination, copying or use of this message or attachment is strictly forbidden, as is the disclosure of the information therein. If you have received this E-Mail in error, please notify us immediately by E-Mail or telephone and delete this message and all its attachments subsequently. All reasonable precautions have been taken to ensure no viruses are present in this E-Mail.
_______________________________________________ python-de maillist - python-de@python.org http://mail.python.org/mailman/listinfo/python-de
On Jul 19, 2013, at 4:10 PM, Tamer Higazi wrote:
Hallo Frank!
Hier, ich habe dir ein kleines Sample geschrieben:
Frank hat @classmethod schon korrekt verwandt - seine Frage war nicht, wie er eine classmethod (oder staticmethod) macht, sondern wie die mit *anderen* Methoden interagiert. Womit sich also eigentlich dein (und auch so manch anderer Post hier) eruebrigen.
class MeineKlasse:
Variable = 'Hallo'
def MeineFunk(ds): print 'Hallo %s, ich bin eine statische Methode!' % (ds) print MeineKlasse.Variable
MeineFunk = staticmethod(MeineFunk)
Python 2.4 ist 2004 - also knapp vor 10 Jahren - erschienen. Seit dem benutzt man eigentlich Dekoratoren fuer sowas. Und staticmethod eigentlich so gut wie nie. Man sieht an deiner eigenen Implementierung, warum: @classmethod def MeineFunk(cls, ds): print cls.Variable Womit sogar ueberladung moeglich waere.
Hier zum nachlesen: http://openbook.galileocomputing.de/python/python_kapitel_12_001.htm
Und das erklaert's - das galileo open book ist ueblicherweise eher als schlecht zu bezeichnen. BlackJack hat mal schoen aufgeschrieben, warum. http://blog.marc.rintsch.de/2012/11/18/python_openbook.html Diez
Sorry hatte ich total verpeilt! Tamer On 07/19/13 18:01, Diez B. Roggisch wrote:
Frank hat @classmethod schon korrekt verwandt - seine Frage war nicht, wie er eine classmethod (oder staticmethod) macht, sondern wie die mit *anderen* Methoden interagiert. Womit sich also eigentlich dein (und auch so manch anderer Post hier) eruebrigen.
Hallo, möchte mich recht herzlich bei allen bedanken, die mir bei dieser Problematik auf die Sprünge geholfen haben. Ich denke ich habs gefressen. Viele Grüße Frank -- Bevor Sie diese E-Mail ausdrucken, überlegen Sie bitte, ob dies wirklich erforderlich ist. Please think before you print. -- WIKA Alexander Wiegand SE & Co. KG Alexander-Wiegand-Straße 30 - 63911 Klingenberg - Germany Kommanditgesellschaft: Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 1819 Komplementärin: WIKA Verwaltungs SE & Co. KG - Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 4685 Komplementärin: WIKA International SE - Sitz Klingenberg - Amtsgericht Aschaffenburg HRB 10505 Vorstand: Alexander Wiegand Vorsitzender des Aufsichtsrats: Dr. Max Egli Telefon: (09372) 132-0 Internet: www.wika.com -- The information contained in this E-Mail and any attached files are strictly confidential and may be subject to legal privilege. If you are not the intended recipient, his representative or the person responsible for delivering the message to the intended recipient, be advised that you have received this message in error and that any dissemination, copying or use of this message or attachment is strictly forbidden, as is the disclosure of the information therein. If you have received this E-Mail in error, please notify us immediately by E-Mail or telephone and delete this message and all its attachments subsequently. All reasonable precautions have been taken to ensure no viruses are present in this E-Mail.
Hallo Herr Wagner, Und, welchen Ansatz haben Sie letztendlich in Anspruch genommen?! On 07/23/13 09:41, Wagner, Frank wrote:
Hallo,
möchte mich recht herzlich bei allen bedanken, die mir bei dieser Problematik auf die Sprünge geholfen haben.
Ich denke ich habs gefressen.
Viele Grüße
Frank
entweder @classmethod an dev verarbeite(...) dranschreiben, oder in getOutput cls.verarbeite(cls, zahl) schreiben. ________________________________ Von: python-de [mailto:python-de-bounces+klaus.kopruch=materna.de@python.org] Im Auftrag von Wagner, Frank Gesendet: Freitag, 19. Juli 2013 15:24 An: Die Deutsche Python Mailingliste (python-de@python.net) Betreff: [Python-de] Klassenmethoden Hallo ich hab folgendes Problem: Ich möchte einige Methoden einer Klasse verwenden ohne zuvor eine Instanz der Klasse anlegen zu müssen. Wie ich in Erfahrung gebracht habe ist dies mit dem Schlüsselwort @classmethod vor der eigentlichen Methode möglich wenn diese Methode ihre Zugriffe über cls und nicht self referenziert. Offensichtlich ist es mir allerdings nicht möglich eine Methode der Klasse hiermit zu verwenden die sich auf eine Instanz bezieht also mit def foo(self, ...) erstellt ist? Gibt es eine Möglichkeit dies zu lösen oder muss ich jetzt alle Methoden der Klasse als Klassenmethoden ausweisen und cls statt self verwenden? Hierbei würde es allerdings wenig Sinn machen noch eine Klasse zu definieren, da könnte ich ja auch alle Methoden direkt in ein modulfile schreiben. Hier ein kleines Beispiel was ich meine: << class ModulTest(): ''' Kurze Beschreibung der Klasse und ihrer Mehtoden ''' Liste= [] String = "0" fl_val = 0.0 int_val = 0 def __init__(self): ''' Kurze Beschreibung der Funktion Kurze Beschreibung der Argumente Kurze Beschreibung der Rueckgabewerte ''' pass def verarbeite(self, Zahl): self.String = str(Zahl) for i in self.String: self.Liste.append(i) @classmethod def getOutput(cls, zahl): cls.verarbeite(zahl) print cls.String
Aufgerufen soll es wie folgt werden:
From modultest import ModulTest as mt mt.getOutput(12)
Schon jetzt vielen Dank für Eure Ratschläge Gruß Frank -- [http://en-co.wika.de/upload/PIC_EB_PSM01_02_MH_en_co_50772.gif]<http://en-co.wika.de/PSM02_en_co.WIKA?utm_campaign=E-Mail-Banner-EN-CO-2013&utm_source=EB-EN-CO-2013-29-PSM01-02&utm_medium=E-Mail-Banner> <http://en-co.wika.de/PSM02_en_co.WIKA?utm_campaign=E-Mail-Banner-EN-CO-2013&utm_source=EB-EN-CO-2013-27-PSM01-02&utm_medium=E-Mail-Banner> -- P Bevor Sie diese E-Mail ausdrucken, überlegen Sie bitte, ob dies wirklich erforderlich ist. Please think before you print. -- WIKA Alexander Wiegand SE & Co. KG Alexander-Wiegand-Straße 30 - 63911 Klingenberg - Germany Kommanditgesellschaft: Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 1819 Komplementärin: WIKA Verwaltungs SE & Co. KG - Sitz Klingenberg - Amtsgericht Aschaffenburg HRA 4685 Komplementärin: WIKA International SE - Sitz Klingenberg - Amtsgericht Aschaffenburg HRB 10505 Vorstand: Alexander Wiegand Vorsitzender des Aufsichtsrats: Dr. Max Egli Telefon: (09372) 132-0 Internet: www.wika.com<http://www.wika.com> -- The information contained in this E-Mail and any attached files are strictly confidential and may be subject to legal privilege. If you are not the intended recipient, his representative or the person responsible for delivering the message to the intended recipient, be advised that you have received this message in error and that any dissemination, copying or use of this message or attachment is strictly forbidden, as is the disclosure of the information therein. If you have received this E-Mail in error, please notify us immediately by E-Mail or telephone and delete this message and all its attachments subsequently. All reasonable precautions have been taken to ensure no viruses are present in this E-Mail.
participants (4)
-
Diez B. Roggisch
-
Klaus.Kopruch@materna.de
-
Tamer Higazi
-
Wagner, Frank