Seite 1 von 1

Methode von nicht-instanzierter Klasse aufrufen

Verfasst: Freitag 5. Mai 2006, 11:40
von droptix
Habe eine Klasse "foo". Die braucht ein Argument "mode", dass von sys.argv[1] kommt. Ist kein sys.argv[1] gegeben, soll die Methode "usage()" aufgerufen werden, obwohl noch keine Instanz von "foo" vorhanden ist:

Code: Alles auswählen

import sys

class foo:
    # constructor
    def __init__(self, mode):
        print mode
    # usage
    def usage(self):
        print """
        foo.bar
        """

if __name__ == "__main__":
    if not len(sys.argv) > 1:
        foo.usage();
    else:
        foo(sys.argv[1])
Fehlermeldung:
cmd hat geschrieben:Traceback (most recent call last):
File "pyshell.py", line 21, in ?
XmlRpcShell.usage();
TypeError: unbound method usage() must be called with XmlRpcShell instance as fi
rst argument (got nothing instead)
In PHP kann man so auf die Methode einer nicht-instanzierten Klasse zugreifen (Kurzform):
PHP hat geschrieben:<?php
class foo() {
function usage() {
echo ("foo.bar");
}
}

// no instance yet, but method is callable:
foo::usage();
?>
Wie geht das in Python?

Re: Methode von nicht-instanzierter Klasse aufrufen

Verfasst: Freitag 5. Mai 2006, 11:48
von gerold
Hi droptix!

Die Funktion "usage" zeigt eine Meldung an, die nur dann wichtig ist,
wenn das Modul **direkt** aufgerufen wurde. Wenn das Modul
importiert wurde, dann braucht es die Funktion "usage" nicht. Warum
willst du sie dann unbedingt in der Klasse haben?

Code: Alles auswählen

import sys

# usage
def usage():
    print """
    foo.bar
    """

class foo:
    # constructor
    def __init__(self, mode):
        print mode

if __name__ == "__main__":
    if not len(sys.argv) > 1:
        usage();
    else:
        foo(sys.argv[1])
Es gibt zwar auch die Möglichkeit, die Funktion mit @staticmethod zu
dekorieren, das ist aber in deinem Fall nicht angebracht, da "usage" ja
sowiso nicht in die Klasse passt.

lg
Gerold
:-)

usage() gehört zum Programm

Verfasst: Freitag 5. Mai 2006, 12:02
von droptix
Na weil usage() zum Programm gehört. Tut nix weiter als die Syntax des Programms auszugeben... Angenommen, mein Programm verlangt

foo.py bar

Dann ist zwar sys.argv[1] gegeben, aber "bar" ist vielleicht kein gültiger Parameter für die Klasse. Also wird später der Constructor den Parameter "mode" überprüfen und bei falscher Syntax/falschem Wert ebenfalls usage() aufrufen. Also gehört usage() direkt zum Programm und sollte in der Klasse sein.

Ich kann natürlich auch das hier machen und dann mode prüfen:

Code: Alles auswählen

if __name__ == "__main__":
    foo(sys.argv[1:])

Verfasst: Freitag 5. Mai 2006, 12:38
von Rebecca
Nicht direkt eine Antwort auf deine Frage, aber vielleicht solltest du dir mal das Modul optparse ansehen?

Verfasst: Freitag 5. Mai 2006, 13:20
von jens
Rebecca hat geschrieben:optparse
Jup, hab erst gestern damit was gemacht:

https://opensvn.csie.org/traccgi/PyLuci ... fs.py#L172

Noch ein Beispiel von Leonidas:
http://www.python-forum.de/post-16397.html#16397

Verfasst: Freitag 5. Mai 2006, 13:29
von mitsuhiko
Hat denn keiner eine Antwort für den armen droptix?

Code: Alles auswählen

>>> class C(object):
...     @staticmethod
...     def usage():
...             print "Hello World"
...
>>> C.usage()
Hello World
//Edit: sorry, mein Fehler. Gerold hat staticmethod schon erwähnt

Re: Methode von nicht-instanzierter Klasse aufrufen

Verfasst: Freitag 5. Mai 2006, 13:54
von jens
droptix hat geschrieben:Habe eine Klasse "foo". Die braucht ein Argument "mode", dass von sys.argv[1] kommt. Ist kein sys.argv[1] gegeben, soll die Methode "usage()" aufgerufen werden, obwohl noch keine Instanz von "foo" vorhanden ist:
Warum machst du nicht mode = None, wenn sys.argv[1] nicht da ist und reagierst in einer Klasse dementsprechend...