2569 Stimmen

Statische Klassenvariablen und Methoden in Python

Wie erstelle ich statische Klassenvariablen oder Methoden in Python?

4voto

Dies ist wahrscheinlich ein Hack, aber ich habe mit eval(str) um ein statisches Objekt zu erhalten, was in Python 3 irgendwie ein Widerspruch ist.

Es gibt eine Datei Records.py, die nichts anderes enthält als class Objekte, die mit statischen Methoden und Konstruktoren definiert sind, die einige Argumente speichern. Dann aus einer anderen .py-Datei I import Records aber ich muss dynamisch jedes Objekt auswählen und dann instanziieren es auf Nachfrage nach der Art der Daten eingelesen werden.

Wo also object_name = 'RecordOne' oder den Klassennamen, rufe ich cur_type = eval(object_name) und dann, um es zu instanziieren, tun Sie cur_inst = cur_type(args) Bevor Sie jedoch instanziieren, können Sie die statischen Methoden von cur_type.getName() zum Beispiel, eine Art abstrakte Basisklassenimplementierung oder was auch immer das Ziel ist. Im Backend wird es jedoch wahrscheinlich in Python instanziiert und ist nicht wirklich statisch, da eval ein Objekt zurückgibt...., das instanziiert worden sein muss...., das ein statisches Verhalten zeigt.

4voto

Winter Squad Punkte 149

Wenn Sie versuchen, eine statische Variable freizugeben, um sie zum Beispiel in anderen Instanzen zu erhöhen, funktioniert so etwas wie dieses Skript gut:

# -*- coding: utf-8 -*-
class Worker:
    id = 1

    def __init__(self):
        self.name = ''
        self.document = ''
        self.id = Worker.id
        Worker.id += 1

    def __str__(self):
        return u"{}.- {} {}".format(self.id, self.name, self.document).encode('utf8')

class Workers:
    def __init__(self):
        self.list = []

    def add(self, name, doc):
        worker = Worker()
        worker.name = name
        worker.document = doc
        self.list.append(worker)

if __name__ == "__main__":
    workers = Workers()
    for item in (('Fiona', '0009898'), ('Maria', '66328191'), ("Sandra", '2342184'), ('Elvira', '425872')):
        workers.add(item[0], item[1])
    for worker in workers.list:
        print(worker)
    print("next id: %i" % Worker.id)

3voto

Jay Punkte 2017

Sie können eine Liste oder ein Wörterbuch verwenden, um "statisches Verhalten" zwischen Instanzen zu erhalten.

class Fud:

     class_vars = {'origin_open':False}

     def __init__(self, origin = True):
         self.origin = origin
         self.opened = True
         if origin:
             self.class_vars['origin_open'] = True

     def make_another_fud(self):
         ''' Generating another Fud() from the origin instance '''

         return Fud(False)

     def close(self):
         self.opened = False
         if self.origin:
             self.class_vars['origin_open'] = False

fud1 = Fud()
fud2 = fud1.make_another_fud()

print (f"is this the original fud: {fud2.origin}")
print (f"is the original fud open: {fud2.class_vars['origin_open']}")
# is this the original fud: False
# is the original fud open: True

fud1.close()

print (f"is the original fud open: {fud2.class_vars['origin_open']}")
# is the original fud open: False

2voto

ganja Punkte 21

Um es so auszudrücken, die statische Variable wird erstellt, wenn eine benutzerdefinierte Klasse entsteht und die Definition einer statischen Variable sollte dem Schlüsselwort self folgen,

class Student:

    the correct way of static declaration
    i = 10

    incorrect
    self.i = 10

1voto

Sunil Garg Punkte 12298

Nicht wie die @staticmethod aber Klassenvariablen sind statische Methoden der Klasse und werden mit allen Instanzen geteilt.

Jetzt können Sie sie wie folgt aufrufen

instance = MyClass()
print(instance.i)

o

print(MyClass.i)

müssen Sie diesen Variablen den Wert zuweisen

Ich habe versucht

class MyClass:
  i: str

und die Zuweisung des Wertes in einem Methodenaufruf, in diesem Fall wird es nicht funktionieren und einen Fehler auslösen

i is not attribute of MyClass

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X