2016-04-13 14 views
1

Ich versuche, eine Funktion zu initialisieren, meine globalen Klassenebene Variablen. Beachten Sie, dass ich aus irgendeinem Grund keinen Konstruktor schreiben kann, um den Job auszuführen. (Grund: Ich bin ein Testfall für Tempest schreiben)Eine Funktion außerhalb jeder Methode aufrufen, aber innerhalb einer Klasse?

Code:

class my_class(ParentClass): 
    username = "abc" 
    password = "123" 
    hostname = self._get_hostname() # Error: self is undefined 
    hostname = _get_hostname()  # Error: _get_hostname is undefined 

    def myFunct(self): 
     ... 
     ... 

    def _get_hostname(self): 
     ... 
     ... 

Ist es sogar möglich, in Python globalen Klasse-Ebene Variablen mit Klassenfunktionen zu initialisieren?

Anmerkung 1: Ich habe auch versucht hostname Initialisierung nach der _get_hostname() Funktion geschrieben wird, aber nicht von Nutzen auszuführen.

Anmerkung 2: I hostname Initialisierung innerhalb einer Funktion wie ausführen kann:

def myFunction(self): 
    hostname = self._get_hostname() 
    # do something with hostname 
    ... 

Aber das würde den ganzen Zweck vereitelt ein globalen Variable auf Klassenebene zu verwenden. Ich möchte eine Klassenvariable für Wiederverwendung in anderen Funktionen verwenden.

+0

Verwenden Sie 'def __init __ (self):' Für den Konstruktor ist der Code nach der Klassendefinition kein Konstruktor. – xthestreams

+0

@xthestreams Liebes Ich habe bereits erwähnt, dass ich ** ** keinen Konstruktor schreiben kann. – InamTaj

+0

@InamTaj warum machst du '_get_hostname (cls):' eine Klassenmethode dann wie '' classmethod' Dekorator verwenden? – ozgur

Antwort

0

Erstens: Sie sind keine globalen Variablen; sie sind Klasse Variablen. (. Globals sind am Modulbereich definiert)

Wenn _get_hostname() nicht wirklich Verwendungself überhaupt, können Sie etwas ein wenig lückenhaft tun: Stellen Sie sicher, dass es definiert ist vor Sie es benutzen, dann rufen mit einem falschen ersten Argument.

class my_class(ParentClass): 
    def _get_hostname(self): 
     ... 
    hostname = _get_hostname(None) # Doesn't matter what 

Dies funktioniert, weil, wenn Sie es in der class Anweisung aufrufen, können Sie es immer noch als normale Funktion behandeln kann. Es muss nur definiert werden, bevor Sie es wie jede Funktion verwenden.

Wenn es tatsächlich einen Verweis auf ein Objekt (oder auch nur die Klasse) erfordert, wird dies nicht funktionieren, weil die Klasse noch nicht existiert. Das Beste, was Sie tun können, ist, entweder eine Funktion vor der class-Anweisung zu definieren, die die Klasse nicht verwendet, und sie aufzurufen. (Dies ist auch das, was Sie tun würden, wenn die vorherige Option möglich ist, aber ... geschmacklos.)

def _get_hostname(): 
    ... 

class my_class(ParentClass): 
    hostname = _get_hostname() 

oder verschieben die Klassenvariable initialisiert, bis die class definiert ist. In diesem Fall sollte _get_hostname wahrscheinlich als eine statische Methode oder eine Klassenmethode deklariert werden, so dass Sie die Klasse nicht nur initialisieren müssen, um die Klassenvariable zu initialisieren.

class my_class(ParentClass): 
    @classmethod 
    def _get_hostname1(cls): 
     ... 

    @staticmethod 
    def _get_hostname2(): 
     ... 

my_class.hostname = my_class._get_hostname1() 
my_class.hostname = my_class._get_hostname2() 
+0

Das ist sehr unpythonisch, es gibt einen Grund, warum es einen @staticmethod-Dekorator gibt. – Natecat

+0

Ich habe keine Ahnung, was '_get_hostname1' tatsächlich tut, weshalb ich die Möglichkeit erwähne, es zu einer' Klassenmethode' zu ​​machen. Ich würde dringend die reguläre Funktion empfehlen, die vor der Klasse definiert wurde, wenn dies machbar ist. – chepner

+0

Ich habe die Korrektur der Variablen auf Klassenebene statt global vorgenommen. Ich habe mich geirrt, sie global zu nennen. – InamTaj

0

Sie können Instanzmethoden für eine Instanz, die noch nicht existiert, nicht aufrufen. Wenn Sie möchten, dass es von jeder Instanz unabhängig ist und die von Ihnen aufgerufenen Funktionen keine Informationen von der Instanz benötigen, können Sie einen @ staticmethod-Dekorator verwenden, damit Sie den Hostnamen statisch abrufen können.

+0

Das gleiche Problem tritt bei der Methode '@ staticmethod' auf, wenn ich versuche, die Initialisierung durchzuführen. Das mache ich. 'hostname = my_class._get_hostname()' – InamTaj

+0

Es sollte nur _get_hostname() sein, es sei denn, ich täusche mich, und zusätzlich sollte es keinen Selbst-Parameter nehmen – Natecat