Sind statische Klassen-Variablen möglich?
Ist es möglich, statische Klassenvariablen oder-Methoden in python? Was syntax ist erforderlich, um dies zu tun?
InformationsquelleAutor Andrew Walker | 2008-09-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deklarierten Variablen innerhalb der definition der Klasse, aber nicht innerhalb einer Methode werden der Klasse oder statischen Variablen:
Als @millerdev Punkte raus, das wird eine Klasse-level -
i
variable, aber dies unterscheidet sich von einer beliebigen Instanz-Ebenei
variable, so dass Sie haben könnteDies ist anders als bei C++ und Java, aber nicht so Verschieden von C#, wo ein statisches Element kann nicht zugegriffen werden, mithilfe einer Referenz auf eine Instanz.
Sehen was die Python-tutorial zu sagen hat zum Thema Klassen und Objekte der Klasse.
@Steve Johnson bereits beantwortet hat bezüglich statische Methoden, ebenfalls dokumentiert unter "Built-in-Funktionen" in der Python Library Reference.
@beidy empfiehlt classmethods über staticmethod, wie die Methode erhält dann den Klasse Typ wie das erste argument, aber ich bin immer noch ein wenig verschwommen auf die Vorteile, die dieser Ansatz über staticmethod. Wenn Sie auch sind, dann ist es wahrscheinlich egal.
@classmethod
über@staticmethod
ist, soweit ich weiß, ist, dass Sie immer den Namen der Klasse die Methode aufgerufen wurde, selbst, wenn es eine Unterklasse. Eine statische Methode fehlt diese information, so dass Sie nicht im Aufruf einer überschriebenen Methode, zum Beispiel.die pythonic way für Konstanten nicht wachsen eine Klasse für Konstanten. Nur haben einige
const.py
mitPI = 3.14
und importieren Sie es überall.from const import PI
Diese Antwort ist wahrscheinlich verwechseln Sie die statische variable Problem. Zu Beginn
i = 3
nicht eine statische variable, ist es ein class-Attribut, und da es sich von einer Instanz-level-Attributi
es spielt nicht Verhalten sich wie statische Variablen in anderen Sprachen. Siehe millerdev Antwort, Yann Antwort und meine Antwort unten.also nur eine Kopie von
i
(statische variable) im Speicher, auch wenn ich Hunderte von Instanz dieser Klasse ?Für alle, die Interesse haben, die Daniel erwähnt in @Dubslow Kommentar, es ist millerdev (wayback machine)
InformationsquelleAutor Blair Conrad
@Blair Conrad sagte, statische Variablen, die innerhalb der definition der Klasse, aber nicht innerhalb einer Methode sind "Klasse" oder "static" - Variablen:
Gibt es ein paar gotcha hier. Die Durchführung aus dem Beispiel oben:
Beachten Sie, wie die Instanz-variable
t.i
bekam die out-of-sync mit dem "static" Klasse variable, wenn das Attributi
war direkt auft
. Dies ist, weili
wurde neu gebunden innerhalb dert
namespace, die sich von derTest
namespace. Wenn Sie möchten, ändern Sie den Wert "static" variable, die Sie ändern müssen, die es im Rahmen (oder Objekt), in dem es ursprünglich definiert. Ich "statisch" in Anführungszeichen, weil Python nicht wirklich statische Variablen in dem Sinne, dass C++ und Java zu tun.Obwohl es nicht sagen, etwas bestimmtes über statische Variablen oder Methoden, die Python-tutorial hat einige relevante Informationen auf Klassen und Objekte der Klasse.
@Steve Johnson beantwortete auch in Bezug auf statische Methoden, die auch dokumentiert unter "Built-in-Funktionen" in der Python Library Reference.
@beid auch erwähnt classmethod, die ähnlich staticmethod. Eine classmethod das erste argument ist die Klasse Objekt. Beispiel:
Ein Weg, um die statischen Variablen in sync ist, um Ihnen Eigenschaften:
class Test(object):
,_i = 3
,@property
,def i(self)
,return type(self)._i
,@i.setter
,def i(self,val):
,type(self)._i = val
. Jetzt können Siex = Test()
,x.i = 12
,assert x.i == Test.i
.So konnte ich sagen, dass alle Variablen statisch sind zunächst und dann Zugriff auf Instanzen macht instance-Variablen zur Laufzeit?
Vielleicht ist dies interessant: wenn Sie eine Methode definieren, die in Test, die änderungen zu Testen.ich, das wird Auswirkungen auf BEIDE Testen.i und t sind.ich Werte.
wie u erwähnt Python nicht statische Variablen wie C++ oder JAVA haben..So wird es in Ordnung sein zu sagen, Testen.ich wird mehr von einer Klasse, variable, anstatt eine statische variable?
InformationsquelleAutor millerdev
Statische und Klassenmethoden
Als die anderen Antworten haben darauf hingewiesen, statische und Klassenmethoden werden leicht erreicht mit dem eingebauten Dekorateure:
Als üblich, das erste argument
MyMethod()
ist gebunden an die Klasse-Instanz-Objekt. Im Gegensatz dazu, das erste argumentMyClassMethod()
ist an das class-Objekt selbst (z.B. in diesem FallTest
). FürMyStaticMethod()
keines der Argumente gebunden sind, und dass Argumente ist optional."Statische Variablen"
Aber die Umsetzung von "statische Variablen" (veränderlich statische Variablen, sowieso, wenn das nicht ein Widerspruch in sich...) ist nicht als geradlinig. Als millerdev zeigte in seiner Antwort, das problem ist, dass Python die class-Attribute sind nicht wirklich "statische Variablen". Bedenken Sie:
Dies ist da die Grenze
x.i = 12
hat eine neue Instanz Attributi
zux
anstelle der änderung des Wertes derTest
Klassei
Attribut.Teilweise erwartet statische Variablen Verhalten, d.h., die Synchronisierung des Attributs zwischen mehreren Instanzen (aber nicht mit der Klasse selbst; siehe "gotcha" weiter unten), kann erreicht werden, durch drehen des class-Attributs in eine Immobilie:
Können Sie jetzt tun:
Die statische variable wird nun synchron bleiben zwischen allen Instanzen der Klasse.
(HINWEIS: Das ist, es sei denn, eine Klasse Instanz entscheidet, zu definieren, seine eigene version von
_i
! Aber wenn jemand sich entscheidet DAS zu tun, Sie verdienen, was Sie bekommen, nicht wahr???)Beachten Sie, dass technisch gesehen, ist
i
ist noch nicht eine 'statische variable' überhaupt; es ist eineproperty
, die eine Besondere Form von Deskriptoren. Jedoch, dieproperty
Verhalten ist nun äquivalent zu a (veränderlich) statische variable synchronisieren, die alle Instanzen der Klasse.Unveränderlich "Statische Variablen"
Für unveränderliche statische Variablen Verhalten, einfach weglassen, die
property
setter:Nun versuchen, die Instanz
i
Attribut zurückAttributeError
:Eine Gotcha Bewusst sein,
Beachten Sie, dass die oben genannten Methoden funktionieren nur mit Instanzen Ihrer Klasse - Sie wird nicht Arbeit bei der Verwendung der Klasse selbst. So zum Beispiel:
Die Linie
assert Test.i == x.i
einen Fehler produziert, weil diei
AttributTest
undx
sind zwei verschiedene Objekte.Viele Leute finden das überraschend. Es sollte jedoch nicht sein. Wenn wir zurück gehen und prüfen unsere
Test
definition der Klasse (die zweite version), wir beachten Sie diese Zeile:Klar, das Mitglied
i
vonTest
muss einproperty
Objekt, das den Typ des Objekts zurückgegeben, die von derproperty
Funktion.Wenn Sie die oben verwirrend, Sie sind wahrscheinlich immer noch denken, über den es aus der Sicht anderer Sprachen (z.B. Java oder c++). Sie sollten gehen Studie der
property
- Objekt über die Reihenfolge, in der Python-Attribute zurückgegeben werden, der Deskriptor-Protokoll, und die Methode resolution order (MRO).Präsentiere ich eine Lösung zu den oben genannten 'gotcha' (unten); allerdings würde ich vorschlagen - heftig -, dass Sie nicht versuchen, etwas zu tun, wie die folgenden, bis - mindestens - Sie gründlich zu verstehen, warum
assert Test.i = x.i
einen Fehler verursacht.REAL, tatsächlich Statische Variablen -
Test.i == x.i
Präsentiere ich die (Python 3) Lösung unten dienen nur zu Informationszwecken. Ich bin nicht befürworten, es als eine "gute Lösung". Ich habe meine Zweifel, ob die statische variable emuliert das Verhalten der anderen Sprachen in Python ist eigentlich immer notwendig. Doch unabhängig davon, ob es tatsächlich sinnvoll ist, das unten sollte helfen, das Verständnis fördern, wie Python funktioniert.
UPDATE: dieser Versuch ist wirklich furchtbar; wenn Sie darauf bestehen, etwas wie das zu tun (Tipp: bitte nicht; Python ist eine sehr elegante Sprache und Schuh-horning es in sich wie eine andere Sprache ist einfach nicht notwendig), verwenden Sie den code in Ethan Furman Antwort statt.
Statische variable emuliert das Verhalten der anderen Sprachen mit einer Metaklasse
Eine Metaklasse ist die Klasse einer Klasse. Die Standard-Metaklasse für alle Klassen in Python (d.h., der "new style" - Klassen, post-Python-2.3 glaube ich) ist
type
. Zum Beispiel:Können Sie jedoch definieren Sie Ihre eigene Metaklasse wie diese:
Und wenden Sie es auf Ihrer eigenen Klasse, wie dieses (Python 3):
Unten ist eine Metaklasse, die ich erstellt habe, die versucht zu emulieren "statische variable" Verhalten der anderen Sprachen. Es funktioniert im Grunde durch das ersetzen der Standard-getter -, setter-und deleter mit Versionen, die prüfen, um zu sehen, ob das Attribut angefordert wird, ist eine "statische variable".
Einen Katalog der "statische Variablen" gespeichert ist in die
StaticVarMeta.statics
Attribut. Alle Attribut-Anforderungen sind zunächst versucht gelöst zu werden, mit einem Ersatz-Auflösung um. Ich nannte das die "static resolution order", oder "SRO". Dies geschieht, indem für das angeforderte Attribut in der Sammlung "statische Variablen" für eine bestimmte Klasse (oder deren übergeordneten Klassen). Wenn das Attribut erscheint nicht in der "SRO", das-Klasse fallen zurück auf die default-Attribut get/set/delete-Verhalten (d.h., "MRO").Ich denke, man sollte generell die Ansicht, alles, was Sie tun, auf die Instanz der Klasse
Test
(bevor Sie es für die Instanziierung von Instanzen) in die Domäne der meta-Programmierung? Zum Beispiel, ändern Sie die class-Verhalten zu tunTest.i = 0
(hier einfach zerstören das Eigentum Objekt vollständig). Ich denke, der "property-Mechanismus" kicks nur auf den property-Zugriff auf Instanzen einer Klasse (es sei denn, Sie ändern die zugrunde liegenden Verhalten eine meta-Klasse als Zwischenprodukt, vielleicht). Btw, bitte beenden Sie diese Antwort 🙂Vielen Dank 🙂 Ihr Metaklasse am Ende ist interessant, aber eigentlich ein bisschen zu Komplex für meinen Geschmack. Es könnte nützlich sein, in einem großen Rahmen/Anwendung, wo dieser Mechanismus ist unbedingt erforderlich. Trotzdem, dies zeigt beispielhaft, dass, wenn neue (komplexe) nicht-Standard-meta-Verhalten ist wirklich nötig, Python macht es möglich 🙂
Check meine Antwort für eine einfachere Metaklasse, die nicht den job.
Sie sind korrekt; ich habe bearbeitet die Antwort um das problem zu beheben (kann nicht glauben, es ist dort zu sitzen so lange falsch!). Sorry für die Verwirrung.
InformationsquelleAutor Rick Teachey
Können Sie auch hinzufügen von Klassen Variablen Klassen on the fly
- Und class-Instanzen ändern können Klassenvariablen
Ja. Klassen sind effektiv singletons, unabhängig von der namespace-rufen Sie Sie aus.
InformationsquelleAutor Gregory
Persönlich würde ich eine classmethod, Wann immer ich brauchte eine statische Methode. Vor allem, weil ich die Klasse als argument.
oder verwenden Sie einen Dekorateur
Für statische Eigenschaften.. Seine Zeit, die Sie nach oben schauen einige python-definition.. variable kann sich jederzeit ändern. Es gibt zwei Arten von Ihnen mutable und immutable.. Außerdem gibt es Klassen-Attribute Instanz-Attribute.. Nichts wirklich wie statische Attribute im Sinne von java & c++
Warum verwenden die statische Methode in pythonic Sinn, wenn es keine Beziehung was auch immer auf die Klasse an! Wenn ich du wäre, würde ich entweder classmethod, oder definieren Sie die Methode unabhängig von der Klasse.
InformationsquelleAutor emb
Einer speziellen Sache zu beachten, über die statischen Eigenschaften & Instanz-Eigenschaften, im Beispiel unten gezeigt:
Dies bedeutet, dass vor der Zuweisung den Wert einer Instanz-Eigenschaft, wenn wir versuchen, den Zugriff auf die Eigenschaft durch' Instanz, der statische Wert verwendet wird. Jede Eigenschaft deklariert, die in python-Klasse hat immer einen statischen Schlitz im Speicher.
InformationsquelleAutor jondinham
Statische Methoden in python genannt werden classmethods. Werfen Sie einen Blick auf den folgenden code
Beachten Sie, dass, wenn wir die Methode aufrufen myInstanceMethod, bekommen wir einen Fehler. Dies ist, weil es erfordert, dass die Methode, die aufgerufen werden, auf eine Instanz dieser Klasse. Die Methode myStaticMethod als classmethod mit der Dekorateur @classmethod.
Nur für kicks und kichert, wir nennen konnte myInstanceMethod auf die Klasse, indem Sie übergeben eine Instanz der Klasse, etwa so:
InformationsquelleAutor willurd
Definieren, wenn einige member-Variablen, die außerhalb jedes Mitglied die Methode, die variable kann entweder statisch oder nicht-statisch, je nachdem, wie die variable ausgedrückt wird.
Beispiel:
Sind die Ergebnisse
InformationsquelleAutor user2209576
Könnten Sie erzwingen auch eine Klasse statisch zu sein mit metaclass.
Dann, wenn durch Zufall Sie versuchen zu initialisieren MyClass erhalten Sie eine StaticClassError.
Borg idiom ist ein besserer Weg, dies zu behandeln.
Es ist eine abstrakte Klasse, die nur für Unterklassen (und die Instanziierung der Subklassen)
Ich hoffe, dass die Unterklassen nicht mit super() aufrufen, die
__new__
seiner Eltern...InformationsquelleAutor Bartosz Ptaszynski
Ist es möglich
static
Klasse Variablen, aber wahrscheinlich lohnt der Aufwand nicht.Hier ist ein proof-of-concept, geschrieben in Python 3,--, wenn keine über die genauen details sind falsch, der code kann optimiert werden, um mit nur über das, was Sie bedeuten, durch einen
static variable
:und im Einsatz:
und einige tests:
InformationsquelleAutor Ethan Furman
Einen sehr interessanten Punkt, über Python-Attribut-lookup ist, dass es kann verwendet werden, um zu erstellen "virtuelle Variablen":
Normal, es gibt keine Zuordnungen, um diese, nachdem Sie geschaffen werden. Beachten Sie, dass die lookup verwendet
self
da, obwohllabel
ist statisch in dem Sinn, nicht im Zusammenhang mit einer insbesondere Instanz, der Wert hängt immer noch von der (Klasse der) Instanz.InformationsquelleAutor Davis Herring
In Bezug auf diese Antwort, für eine Konstante statische variable, die Sie verwenden können, einen Deskriptor. Hier ist ein Beispiel:
was in ...
Können Sie immer eine Ausnahme auslösen, wenn Sie ruhig ignorieren-Einstellung Wert (
pass
oben) ist nicht Ihr Ding. Wenn Sie auf der Suche für einen C++ -, Java-Stil static class variable:Haben Sie einen Blick auf diese Antwort und die offiziellen docs HOWTO für weitere Informationen über Deskriptoren.
@property
, das ist das gleiche wie mit einem Deskriptor, aber es ist viel weniger code.InformationsquelleAutor Yann
Absolut Ja,
Python selbst habe keine statischen Daten-member explizit, aber Wir können so tun,
Ausgabe
Erklärung
InformationsquelleAutor Mari Selvan
Vermeiden mögliche Verwirrung, ich möchte den Kontrast von statischen Variablen und unveränderliche Objekte.
Einige primitive Objekt-Typen wie integers, floats, strings und touples sind unveränderlich in Python. Dies bedeutet, dass das Objekt, auf das verwiesen wird, die von einem gegebenen Namen nicht ändern, wenn Sie eine der oben genannten Objekttypen. Der name kann zugewiesen werden, um ein anderes Objekt, aber das Objekt selbst kann nicht verändert werden.
Machen eine statische variable geht noch einen Schritt weiter, indem Sie anerkennen nicht den Namen der Variablen, zeigen Sie auf jedes Objekt, dass jedoch die derzeit Punkte. (Hinweis: dies ist ein Allgemeines software-Konzept und nicht auf eine bestimmte Python; bitte siehe andere Beiträge zur information über die Umsetzung Statik in Python).
InformationsquelleAutor Ross
Der beste Weg den ich gefunden ist die Verwendung einer anderen Klasse. Sie können ein Objekt erstellen und dann verwenden Sie es auf andere Objekte.
Mit dem obigen Beispiel habe ich eine Klasse namens
staticFlag
.Diese Klasse soll die static var
__success
(Private Static Var).tryIt
Klasse repräsentiert die reguläre Klasse, die wir verwenden müssen.Nun habe ich ein Objekt für eine fahne (
staticFlag
). Dieses flag wird gesendet als Referenz für alle der normale Objekte.Alle diese Objekte werden der Liste Hinzugefügt
tryArr
.Dieses Skript Ergebnisse:
InformationsquelleAutor Tomer Zait
Ja, durchaus möglich, schreiben Sie statische Variablen und Methoden in python.
Statische Variablen :
Deklarierte Variablen auf Klassenebene sind als statische variable zugegriffen werden kann, die direkt mit dem Klassennamen.
Instanz-Variablen: Variablen, die verbunden sind und auf die Instanz einer Klasse-Instanz-Variablen.
Statische Methoden: Ähnlich wie Variablen, statische Methoden können direkt aufgerufen werden, mit dem Klassennamen. Keine Notwendigkeit, eine Instanz zu schaffen.
Aber denken Sie daran, eine statische Methode kann nicht rufen Sie eine nicht-statische Methode in python.
InformationsquelleAutor Shagun Pruthi
Statische Variablen in der Klasse factory Python ist3.6
Für jeden, der ein Klasse Werk mit Python ist3.6 und verwenden die
nonlocal
Schlüsselwort, um zum Bereich hinzufügen /Kontext der Klasse wird wie folgt erstellt:hasattr(SomeClass, 'x')
istFalse
. ich bezweifle dies, was jemand bedeutet, durch eine statische variable an alle.lol, sah Ihre statische variable code: stackoverflow.com/a/27568860/2026508 +1 internet-sir, und ich dachte, hasattr nicht wie das funktioniert? so ist
some_var
unveränderlich und statisch definiert, oder ist es nicht? Was bedeutet außerhalb getter-Zugriff zu tun haben, mit einer Variablen als statisch oder nicht? ich habe so viele Fragen jetzt. würde gerne hören, einige Antworten, wenn Sie Zeit zu bekommen.Ja, die Metaklasse, ist ziemlich lächerlich. Ich bin mir nicht sicher, ich verstehe die Fragen, aber meiner Meinung nach
some_var
oben ist keine Klasse überhaupt. In Python werden alle class-Mitglieder zugegriffen werden kann von außerhalb der Klasse.Die
nonlocal
keywoard "Beulen" der Gültigkeitsbereich der Variablen. Der Umfang einer Klasse Körper definition ist unabhängig von der Umfang es findet sich in - wenn Sie sagennonlocal some_var
, das ist nur die Schaffung eines nicht-lokalen (sprich: NICHT in der definition der Klasse Anwendungsbereich) Bezeichnung Verweis auf ein anderes benanntes Objekt. Daher ist es nicht angebracht, die definition der Klasse, weil es nicht in der Klasse body Bereich.InformationsquelleAutor jmunsch
Einfach eine Klasse erstellen, enthält alles, was variable
oder Objekttypen. Zugriff auf die Variablen über die Klasse
Namen wie unten:
InformationsquelleAutor JustinC