Wie erstelle ich statische Klassenvariablen oder Methoden in Python?
Antworten
Zu viele Anzeigen?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.
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)
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
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
- See previous answers
- Weitere Antworten anzeigen